2017-02-15 8 views
0

Моя Монго таблица содержит содержит и данные коллекции «Магазины», как ниже:Mongo запрос с использованием фильтра, не получающего точный результат?

{ 
    "ShopId" : 9999, 
    "products" : [ 
     { 
      "productId" : "1234", 
      "productName" : "abcd", 
     }, 
     { 
      "productId" : "5678", 
      "productName" : "abc", 

     }, 
     { 
      "productId" : "2345", 
      "productName" : "def", 

     } 

    ], 
} 

Там будет несколько магазинов в таблице, имеющие список продуктов.

Требование:

Я хочу получать записи, имеющие shopId = 9999 и продукции соответствует строке ABC

Мой запрос

model.Shops.aggregate([{$match:{"ShopId":9999}},{$project:{products:{$filter:{input:'$products',cond: {'productName':/abc/ }}}}}]) 

Проблема:

Он извлекает productname:def с другими данными, которые соответствуют productname:abc.

ответ

1

Вы не можете использовать регулярные выражения поиска с оператором $filter. Единственный способ достижения этой цели является размотать products, фильтр документа, а затем повторно сгруппировать их в массиве

model.Shops.aggregate([ 
    { 
     $match:{ 
     "ShopId":9999 
     } 
    }, 
    { 
     $unwind:"$products" 
    }, 
    { 
     $match:{ 
     "products.productName":/abc/ 
     } 
    }, 
    { 
     $group:{ 
     _id:null, 
     products:{ 
      $push:{ 
       "productName":"$products.productName", 
       "productId":"$products.productId" 
      } 
     } 
     } 
    } 
]) 

выход:

{ 
    "_id":null, 
    "products":[ 
     { 
     "productName":"abcd", 
     "productId":"1234" 
     }, 
     { 
     "productName":"abc", 
     "productId":"5678" 
     } 
    ] 
} 

использовать его с переменной, объявить регулярное выражение, как это :

var regex: /abc/; 

, а затем использовать его непосредственно в запросе

$match:{ 
     "products.productName": regex 
     } 
+0

Выполнение запроса. Но у меня есть еще одно сомнение. Если мне нужно разместить общую переменную для соответствия вместо «abc». Что мне делать между «/ /». Это/searchValue/или/+ searchValue +/ –

+0

@midhunk see my edit – felix

+0

Нет, его не работает .... :( –

0

Ниже код работал на mongoshell для меня, и ваш код выдавал мне ошибку, что отсутствовал параметр «как» для фильтра $.

db.Shops.aggregate([ 
{$match:{"ShopId":9999}}, 
{$project:{ 
    products:{$filter:{input:'$products',as:"product",cond: { $eq: [ "$$product.productName", "abc" ] }}} 
    }} 
])