在对象的三层嵌套数组上进行Mongodb查询

时间:2019-06-29 15:28:31

标签: json database mongodb mongodb-query

我在编写查询以从文档返回三重嵌套值时遇到问题。我正在使用的文档的结构如下

{
  "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 } )

这有可能吗?

1 个答案:

答案 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阶段的情况下完成此操作,但出于可读性考虑,我选择此操作。