Node.js 使用筛选器的Mongo查询未获取准确结果?

Node.js 使用筛选器的Mongo查询未获取准确结果?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,My mongo表包含集合“商店”和如下数据: { "ShopId" : 9999, "products" : [ { "productId" : "1234", "productName" : "abcd", }, { "productId" : "5678", "productName" : "abc", },

My mongo表包含集合“商店”和如下数据:

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

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

        }

    ],
}
桌子上会有几家商店列出产品清单

要求:

我想获取shopId=9999且products与字符串abc匹配的记录

我的问题

问题:


它正在获取包含与productname:abc匹配的其他数据的productname:DEF

下面的代码为我在mongoshell上工作,您的代码给了我一个错误,$filter缺少'as'参数

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

不能将正则表达式搜索与$filter运算符一起使用。实现这一点的唯一方法是展开产品,过滤文档,然后将它们重新分组到一个数组中

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
      }

查询执行得很好。但我还有一个疑问。。如果我必须为match而不是“abc”放置一个公共变量。我应该在“/”之间放置什么。它是/searchValue/还是/+searchValue+/
   $match:{
         "products.productName": regex
      }