我的MongoDBCollection 中有一个嵌套很深的Collection .

当我运行以下查询时:

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']}

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

推荐答案

你可以使用$project&;$unwind&;aggregation个框架中的$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属性是数组时,它才会起作用.在您的示例中,一个相邻字段(Malaysia)不是数组

Mongodb相关问答推荐

避免在 MongoDB 聚合框架中使用 ISODate() 以便管道可以是纯 JSON

如何在 mongodb golang 的单个更新调用中使用 $set 和 $inc?

嵌套数组 $unwind 和 $group 在 mongoDB 中重新组合在一起

在推入 mongodb 时自动填充 golang struct 中的 created_at 和 updated_at

Mongodb按值分组并计算出现次数

如何在mongoDB中按嵌套文档分组( group by )

Mongoose $inc 枚举验证失败

使用 AngularJs 和 MongoDB/Mongoose

如果 mongoDB 服务器正在运行,如何从驱动程序判断

Flask and Mongo

Spring Mongodb @DBREF

$elemMatch 的 MongoDB 索引

MongoDB GridFS VS 直接磁盘 IO

如何确保基于特定字段的数组中的唯一项 - mongoDB?

直接从 URL 查询字符串提供的 mongo 查询有多危险?

移动 MongoDB 的数据文件夹?

填充mongoose后查找

用于 MongoDB 的 Node.js 模块

Mongo 条件为key doesn't exist?

mongodb & max connections最大连接数