我在编写查询以从文档返回三重嵌套值时遇到问题。我正在使用的文档的结构如下
{
"areaname": "name1",
"places": [
{
"placename": "place1",
"objects": [
{
"objname": "obj1",
"tags": [
"tag1",
"tag2"
]
},
{
"objname": "obj2",
"tags": [
"tag6",
"tag7"
]
}
]
},
{
"placename": "place2",
"objects": [
{
"objname": "obj45",
"tags": [
"tag46",
"tag34"
]
},
{
"objname": "obj77",
"tags": [
"tag56",
"tag11"
]
}
]
}
]
}
实际上这很简单,但是我找不到像这样的简单查询的解决方案: “返回在其标签内包含tag1的对象的objname”
因此对于赠予文档,如果我使用“ tag1”作为参数,则查询应返回“ obj1” 如果我使用“ tag2”作为参数,它应该给我相同的结果 另一个示例:使用“ tag56”,它应该仅返回“ obj77”
现在,我可以使用点符号或顶级字段(例如areaname或其他名称)返回整个文档
db.users.find( {"places.objects.tags":"tag1"}, { areaname: 1, _id:0 } )
这有可能吗?
答案 0 :(得分:0)
保持简单:
[
{
"$match" : {
"places.objects.tags" : "tag1"
}
},
{
"$unwind" : "$places"
},
{
"$unwind" : "$places.objects"
},
{
"$match" : {
"places.objects.tags" : "tag1"
}
},
{
"$group" : {
"_id" : "$_id",
"obj_names" : {
"$push" : "$places.objects.objname"
}
}
}
],
您应该将要保留的所有其他字段添加到小组赛阶段, 也可以在没有双重$ unwind阶段的情况下完成此操作,但出于可读性考虑,我选择此操作。