我需要在MongoDB中获取数组数组中的特定对象。
我只需要获取任务对象= [_id = ObjectId(" 543429a2cb38b1d83c3ff2c2")]。
我的文件(项目):
{
"_id" : ObjectId("543428c2cb38b1d83c3ff2bd"),
"name" : "new project",
"author" : ObjectId("5424ac37eb0ea85d4c921f8b"),
"members" : [
ObjectId("5424ac37eb0ea85d4c921f8b")
],
"US" : [
{
"_id" : ObjectId("5434297fcb38b1d83c3ff2c0"),
"name" : "Test Story",
"author" : ObjectId("5424ac37eb0ea85d4c921f8b"),
"tasks" : [
{
"_id" : ObjectId("54342987cb38b1d83c3ff2c1"),
"name" : "teste3",
"author" : ObjectId("5424ac37eb0ea85d4c921f8b")
},
{
"_id" : ObjectId("543429a2cb38b1d83c3ff2c2"),
"name" : "jklasdfa_XXX",
"author" : ObjectId("5424ac37eb0ea85d4c921f8b")
}
]
}
]
}
预期结果:
{
"_id" : ObjectId("543429a2cb38b1d83c3ff2c2"),
"name" : "jklasdfa_XXX",
"author" : ObjectId("5424ac37eb0ea85d4c921f8b")
}
但我没有得到它。 我仍然没有成功测试:
db.projects.find({
"US.tasks._id" : ObjectId("543429a2cb38b1d83c3ff2c2")
}, { "US.tasks.$" : 1 })
我也尝试使用$ elemMatch,但什么都不返回。
db.projects.find({
"US" : {
"tasks" : {
$elemMatch : {
"_id" : ObjectId("543429a2cb38b1d83c3ff2c2")
}
}
}
})
我是否可以使用find()获得预期的结果?如果没有,用什么和如何使用?
谢谢!
答案 0 :(得分:0)
您需要aggregatio n:
db.projects.aggregate([{$unwind:"$US"},
{$unwind:"$US.tasks"},
{$match:{"US.tasks._id":ObjectId("543429a2cb38b1d83c3ff2c2")}},
{$project:{_id:0,"task":"$US.tasks"}}])
应该返回
{ task : {
"_id" : ObjectId("543429a2cb38b1d83c3ff2c2"),
"name" : "jklasdfa_XXX",
"author" : ObjectId("5424ac37eb0ea85d4c921f8b")
}
说明:
$unwind
为每个数组元素$match
是您的查找$project
与find中的项目部分类似,即它指定了您希望在结果中获得的字段如果您知道要搜索的文档(查看效果指标),则可能需要在$match
之前添加第二个$unwind
。
修改:添加了第二个$unwind
,因为US
是一个数组。
不知道你在做什么(所以真的无法分辨并且只是sugesting)但你可能想要检查你的架构(和mongodb)是否适合你的任务,因为该文档看起来就像非规范化的关系数据关系数据库对你来说会更好。