我的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
。
答案 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" ] }}}
}}
])