【问题标题】:Is it possible to flatten MongoDB result query?是否可以展平 MongoDB 结果查询?
【发布时间】:2012-10-28 05:14:06
【问题描述】:

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

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

【问题讨论】:

    标签: mongodb mongodb-query flatten


    【解决方案1】:

    在新的aggregation framework 下非常简单。 $project 和 $unwind 操作是正确的。

    【讨论】:

      【解决方案2】:

      您可以使用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 属性是数组时才有效。在您的示例中,一个相邻字段(马来西亚)不是数组

      【讨论】:

      • 谢谢!我得到以下信息:{ "result" : [ ], "ok" : 1 } :/
      • 有趣。它仍然感觉像很多工作,但我想我只需要习惯它。谢谢
      • 在事实发生 5 年后看到这个...... Mongo - 我爱 - 仍然很奇怪。
      【解决方案3】:

      做起来更简单,也许是最近的

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 2011-01-28
        • 2016-04-12
        • 2012-09-14
        • 1970-01-01
        • 2019-07-07
        相关资源
        最近更新 更多