我正在使用mongo v3.4.4
如何获取数组的对象
收集样本
{
name: earth
age: 12
cars : [
{
brand : tesla
color : red
time : 123
},
{
brand : toyota
color : black
time : 124
},
]
},
{
name: mars
age: 15
cars : [
{
brand : volvo
color : green
time : 125
},
{
brand : honda
color : blue
time : 126
},
]
}
我只需要:
{
brand : tesla
color : red
time : 123
}
我试过了:
db.users.aggregate([
{
$match:{"name":"earth"}
},
{
$project:
{"cars":
{"$filter":
{
input:"$cars",
as:"cars",
condition: "{$eq:[ $$cars.brand :"tesla"]}"
}
}
}
}
])
但是,我仍然没有看到我预期的输出。我不确定我是否正确使用过滤器。如果cars数组中只有一个对象,那么我只返回那个对象。 我看过这个example
答案 0 :(得分:1)
您可以使用以下聚合管道:
db.users.aggregate([
{$match: {name:"earth"}},
{$unwind: "$cars"},
{$replaceRoot: {newRoot: "$cars"}},
{$match: {brand:"tesla"}}
]);
答案 1 :(得分:1)
使用以下聚合查询:
db.users.aggregate({$match:{name:'earth'}},{$unwind:"$cars"},{$match:{"cars.name":'tesla'}},{$project:{"cars":"$cars",_id: 0}});
结果就像这样
{ "cars" : { "name" : "tesla", "color" : "red" } }
答案 2 :(得分:1)
我会说通过使用以下查询
而不是使用聚合db.users.find({ "name":"earth" }, { "cars" : { "$elemMatch" : { "name" : "tesla }}})
你的输出将是,
{
"cars" : [
{
brand : tesla
color : red
time : 123
}]
}
聚合始终是一项代价高昂的操作