是否可以展平MongoDB结果查询?

Mar*_*ace 39 flatten mongodb mongodb-query

我在MongoDB集合中有一个深层嵌套的集合.

当我运行以下查询时:

db.countries.findOne({},{'data.country.neighbor.name':1,'_id':0})
Run Code Online (Sandbox Code Playgroud)

我最终得到了这个嵌套的结果:

{"data" : {
  "country" : [
    {
      "neighbor" : [
        {
          "name" : "Austria"
        },
        {
          "name" : "Switzerland"
        }
      ]
    },
    {
      "neighbor" : {
        "name" : "Malaysia"
      }
    },
    {
      "neighbor" : [
        {
          "name" : "Costa Rica"
        },
        {
          "name" : "Colombia"
        }
      ]
    }
  ]
}}
Run Code Online (Sandbox Code Playgroud)

现在,这就是我想要的:

['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']
Run Code Online (Sandbox Code Playgroud)

或这个:

{'name':['Austria', 'Switzerland', 'Malaysia', 'Costa Rica', 'Colombia']}
Run Code Online (Sandbox Code Playgroud)

或其他类似的东西......这可能吗?

Ram*_*Vel 58

您可以使用$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
}
Run Code Online (Sandbox Code Playgroud)

$unwind由于名称数组嵌套深,因此使用了两次.它只有在neighbor属性是数组时才有效.在您的示例中,一个邻居字段(马来西亚)不是数组

  • 在事实发生5年后看到了……我爱的蒙哥(Mongo)仍然让人感到奇怪。 (3认同)

小智 11

以更简单的方式完成,也许是最近的

db.countries.aggregate({$unwind:'$data.country.neighbor.name'})
Run Code Online (Sandbox Code Playgroud)