2017-02-15 39 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:defproductname: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看到我的编辑 – felix

+0

不,它不工作.... :( –

0

对于我来说,下面的代码在mongoshell上工作,而且你的代码给我带来了错误,即$ filter的'as'参数缺失。

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