使用过滤器的Mongo查询没有获取确切的结果?

时间:2017-02-15 06:32:56

标签: node.js mongodb mongoose

我的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

2 个答案:

答案 0 :(得分: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
      }

答案 1 :(得分:0)

下面的代码对我来说是mongoshell,你的代码给了我错误,那就是'过滤''参数'$ filter。

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