鉴于以下文件:
{ "id" : 1, "widgets" : [ { "name" : "foo", quantity: 1 }, { "name" : "bar", quantity: 3 } ] },
{ "id" : 2, "widgets" : [ { "name" : "baz", quantity: 2 } ] }
我想返回与 id 1 和名称栏匹配的小部件子文档,但我只想返回该小部件,因此结果应该返回:
{ "name" : "bar", quantity: 3 }
我似乎无法找到一个投影来实现这种情况,而无需查看可能代价高昂的聚合运算符$filter
答案 0 :(得分:0)
db.collection.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
id: 1,
widgets: {
$elemMatch: {
name: 'bar'
}
}
}
},
// Stage 3
{
$unwind: {
path: "$widgets",
}
},
// Stage 4
{
$match: {
'widgets.name': 'bar'
}
},
// Stage 5
{
$project: {
widgets: 1
}
},
]
);
答案 1 :(得分:0)
好吧,如果你想玩aggregate
那么很酷。这就是我做的方式。
db.products.aggregate([
{ $unwind : "$widgets"},
{ $match : {"id" : 1 , "widgets.name" : "bar"}},
{ $addFields: {name: "$widgets.name" ,quantity: "$widgets.quantity"}},
{ $project : {widgets : 0, _id : 0, id : 0}}
])
现在发生的事情是
几乎为您的查询提供服务
由于