嵌套数组上的MongoDB $ elemMatch投影

时间:2017-10-10 15:46:03

标签: mongodb mongodb-query

我有一个像这样的集合(摘要)。

    {
    "id":"summaryid",
    "locations": [
        {
            "id": "loc1",
            "datacenters": [
                {
                    "id": "dc1.1",
                    "clusters": [
                        {
                            "id": "cl1.1",
                            "servers": [
                                {
                                    "id": "srvr1.1",
                                    "services": [
                                        {
                                            "id": "srvc1.1"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                },
                {
                    "id": "dc1.2",
                    "clusters": [
                        {
                            "id": "cl1.2",
                            "servers": [
                                {
                                    "id": "srvr1.2",
                                    "services": [
                                        {
                                            "id": "srvc1.2"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            "id": "loc2",
            "datacenters": [
                {
                    "id": "dc2.1",
                    "clusters": [
                        {
                            "id": "cl2.1",
                            "servers": [
                                {
                                    "id": "srvr2.1",
                                    "services": [
                                        {
                                            "id": "srvc2.1"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                },
                {
                    "id": "dc2.2",
                    "clusters": [
                        {
                            "id": "cl2.2",
                            "servers": [
                                {
                                    "id": "srvr2.2",
                                    "services": [
                                        {
                                            "id": "srvc2.2"
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }

            ]
        }
    ]
}

现在我只想要用于id为dc1.1的数据中心的集群。我想排除集群的服务器。

我尝试使用查询查询与$ elemMatch和投影如下。

db.summary.find({}, {"locations": { $elemMatch: { "datacenters._id" : 
"dc1.1" } }, "locations.datacenters.clusters":0, 
"locations.datacenters.servers":0, "locations.datacentercount" : 0, 
"locations.clustercount" : 0, "locations.servercount" : 0}).pretty()

我仍然获得所有数据中心,而不是只匹配id的1。 我不确定我是否正确行事。

谢谢!

2 个答案:

答案 0 :(得分:1)

$elemMatch无法投影嵌套的数组元素。

您可以在3.4服务器中尝试以下聚合。

使用$unwind几次到达嵌套数组并应用$match来选择嵌套数组元素。

   db.summary.aggregate([
      {
        "$match": {
          "locations.datacenters._id": "dc1.1"
        }
      },
      {
        "$unwind": "$locations"
      },
      {
        "$unwind": "$locations.datacenters"
      },
      {
        "$match": {
          "locations.datacenters._id": "dc1.1"
        }
      },
      {
        "$project": {
          "locations.datacenters.clusters.servers": 0
        }
      }
    ])

{"$project": {"locations.datacenters.clusters.servers": 0}}将移除servers字段,同时将所有其他字段保留在最终输出中。

来自文档

  

如果指定排除_id以外的字段,则不能   使用任何其他$项目规范表格:即如果您排除   字段,你也不能指定包含字段,重置   现有字段的值,或添加新字段。

参考: https://docs.mongodb.com/manual/reference/operator/aggregation/project/#exclude-fields

答案 1 :(得分:0)

如果您只想为数据中心dc1.1投影群集字段,那么下面的查询就会这样做。

db.summary.find({"locations.datacenters": {$elemMatch: {"id": "dc1.1"}}},{"locations.datacenters.clusters":1, _id : 0})

注意,投影中的_id:0用于排除要显示的字段_id。

可在以下链接中找到更多信息:https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/index.html