2016-01-28 8 views
2

Что я делаю, это список всех документов, введенных клиентом на странице. Затем у меня есть несколько полей поиска, которые они могут использовать для сужения документов. Каждое окно поиска привязано к полю. Я хочу, чтобы они могли искать и сузить результаты по мере их ввода. Одно из полей, которые мне нужно искать в виде массива, в котором хранятся другие объекты. Я могу успешно выполнить это, если поле (и), которое они ищут, находится в основе объекта, но я не могу найти способ поиска в массиве объектов. Ниже приведен пример полного объекта.Mongo Найти несколько совпадений внутри и массив объектов

{ 
"_id" : "fNgY9TcdCnyEFwePT", 
"companyCode" : "demoAccount1", 
"tripNumber" : 5002, 
"tripNumberText" : "5002", 
"custID" : "TnfFBRt3bZvNrSRB7", 
"customerName" : "Am Transport Inc", 
"orderLoadNum" : "50021321", 
"orderPlacedDate" : ISODate("2016-01-27T08:00:00.000Z"), 
"orderDispatch" : [ 
    { 
     "Address" : "4111 Aurora Ave N", 
     "Appt" : "", 
     "Cases" : "", 
     "City" : "Seattle", 
     "Contact" : "", 
     "Customer" : "ABC 1", 
     "DatePuDel" : ISODate("2016-01-27T08:00:00.000Z"), 
     "Email" : "", 
     "Fax" : "", 
     "Notes" : "", 
     "ParsPaps" : "", 
     "Phone1" : "", 
     "Phone2" : "", 
     "Ref" : "", 
     "Skids" : "", 
     "State" : "WA", 
     "Suite" : "", 
     "Weight" : "", 
     "Zip" : "98103", 
     "carrierCharges" : "", 
     "carrierCurrency" : "CDN", 
     "carrierName" : "", 
     "driverName" : "", 
     "stop" : true, 
     "stopDelDate" : "", 
     "stopDelTime" : "", 
     "stopNum" : 0, 
     "stopPuDate" : "", 
     "stopPuTime" : "", 
     "stopType" : "pickup", 
     "trailerNum" : "", 
     "truckNum" : "", 
     "deliveryType" : "", 
     "deliveryStatus" : "Entered" 
    }, 
    { 
     "Address" : "8325 Main St", 
     "Appt" : "", 
     "Cases" : "", 
     "City" : "Vancouver", 
     "Contact" : "", 
     "Customer" : "ABC 2", 
     "DatePuDel" : ISODate("2016-01-27T08:00:00.000Z"), 
     "Email" : "", 
     "Fax" : null, 
     "Notes" : "", 
     "ParsPaps" : "", 
     "Phone1" : "", 
     "Phone2" : "", 
     "Ref" : "", 
     "Skids" : "", 
     "State" : "WA", 
     "Suite" : "", 
     "Weight" : "", 
     "Zip" : "V5X 3M3", 
     "carrierCharges" : "", 
     "carrierCurrency" : "CDN", 
     "carrierName" : "", 
     "driverName" : "Test Driver 1", 
     "stop" : false, 
     "stopDelDate" : "", 
     "stopDelTime" : "", 
     "stopNum" : 1, 
     "stopPuDate" : "", 
     "stopPuTime" : "", 
     "stopType" : "delivery", 
     "trailerNum" : 4412, 
     "truckNum" : 101, 
     "stopMiles" : "182.2", 
     "deliveryType" : "Highway", 
     "deliveryStatus" : "Dispatched", 
     "truckNumText" : "101", 
     "trailerNumText" : "4412" 
    } 
    ] 
} 

Так что я тестировал ниже. Я просто пытаюсь изолировать способ поиска нескольких полей внутри orderDispatch прямо сейчас, а затем добавлю обратно в другие поля.

 query = {"$and": [ 
      { "$elemMatch" :{"orderDispatch.trailerNumText": {$regex: new RegExp('^' + $('input:text[name=traceBoardTrailerNumSetting]').val(), 'i')}}}, 
      { "$elemMatch" :{"orderDispatch.carrierName": {$regex: new RegExp('^' + $('input:text[name=traceBoardCarrierSetting]').val(), 'i')}}}, 
      { "$elemMatch" :{"orderDispatch.truckNumText": {$regex: new RegExp('^' + $('input:text[name=traceBoardTruckSetting]').val(), 'i')}}} 
     ]}; 

Я пробовал несколько вещей, и ни один из них не работает. Было бы очень полезно оценить точку в правильном направлении.

+0

Почему '$ and' вместо' $ or' при поиске нескольких полей? Маловероятно, что все они будут иметь один и тот же шаблон, в то же время нет? –

+0

В этом суть. Это позволило бы использовать значительно сузить его поиск, имея возможность проверять несколько полей. Если я использую или тогда возвращаемые данные не будут такими, как – BobFranz

ответ

1

Существует ошибка синтаксиса в запросе:

Используйте следующий синтаксис для $elemMatch запроса:

db.collectionName.find(
    {"$and": [ 
      { "orderDispatch" : { "$elemMatch" :{ "trailerNumText": {$regex: new RegExp('^' + 'insert your value here', 'i')}}} }, 
      { "orderDispatch" : { "$elemMatch" :{ "carrierName": {$regex: new RegExp('^' + 'insert your value here', 'i')}}} }, 
      { "orderDispatch" : { "$elemMatch" :{ "truckNumText": {$regex: new RegExp('^' + 'insert your value here', 'i')}}} } 
     ]} 
) 
Смежные вопросы