60

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

または似たようなもの...これは可能ですか?

4

3 に答える 3

84

集計$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
}

$unwindname 配列が深くネストされているため、2 回使用されます。また、neighbor属性が配列の場合にのみ機能します。あなたの例では、1 つの隣接フィールド (マレーシア) は配列ではありません

于 2012-11-08T03:10:01.437 に答える
-8

新しい集約フレームワークの下では非常に簡単です。$project および $unwind 操作は、目的に適しています。

于 2012-11-08T03:06:20.443 に答える