是否可以扁平化MongoDB结果查询?

dced5bon  于 2022-10-22  发布在  Go
关注(0)|答案(4)|浏览(183)

我的MongoDB集合中有一个深度嵌套的集合。
当我运行以下查询时:

db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})

我在这里得到了这个嵌套结果:

{"data" : {
  "country" : [
    {
      "neighbor" : [
        {
          "name" : "Austria"
        },
        {
          "name" : "Switzerland"
        }
      ]
    },
    {
      "neighbor" : {
        "name" : "Malaysia"
      }
    },
    {
      "neighbor" : [
        {
          "name" : "Costa Rica"
        },
        {
          "name" : "Colombia"
        }
      ]
    }
  ]
}}

现在,这是我想要的:

['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']

或者这样:

{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}

或者其他类似的东西。这个是可能的吗?

jhiyze9q

jhiyze9q1#

您可以使用aggregation框架的$project&$unwind&$group,让结果更接近您的需求。

> db.countries.aggregate({$project:{a:'$data.country.neighbor.name'}},
                         {$unwind:'$a'},
                         {$unwind:'$a'},
                         {$group:{_id:'a',res:{$addToSet:'$a'}}})
  {
    "result" : [
        {
            "_id" : "a",
            "res" : [
                "Colombia",
                "Malaysia",
                "Switzerland",
                "Costa Rica",
                "Austria"
            ]
        }
    ],
    "ok" : 1
}

$unwind使用了两次,因为名称数组嵌套得很深。只有当neighbor属性是数组时,它才会起作用。在您的示例中,一个相邻字段(马来西亚)不是数组

u4vypkhs

u4vypkhs2#

用简单得多的方法,也许是最近的事

db.countries.aggregate({$unwind:'$data.country.neighbor.name'})
zvokhttg

zvokhttg3#

要扁平化数据,您还可以使用$reduce。以下是文档中的一个例子。

db.countries.aggregate([
  {
    $addFields: {
      newField: {
        $reduce: {
          input: "$data.country.neighbor.name",
          initialValue: [],
          in: { $concatArrays: ["$$value", "$$this"] }
        }
      }
    }
  }
])
zyfwsgd6

zyfwsgd64#

在新的aggregation framework下,它相当简单。$PROJECT和$UNWIND操作就是为了达到这个目的。

相关问题