2017-02-02 7 views
2

ないように、私は私がitems.a要素をお願いしたいのMongoDBはdictsのリストにcertainsフィールドの結果リストを平ら

[{ 
    _id: 1, 
    items: [ 
    {a: 1, b: 2}, 
    {a: 2, b: 2}, 
    {a: 15, b: 7} 
    ] 
}, { 
    _id: 2, 
    items: [ 
    {a: 15, b: 9}, 
    {a: 15, b: 9}, 
    {a: 41, b: 9} 
    ] 
}] 

のようなデータを持っていると言うので、私は私が持っているだろう結果

[[ 
    1, 
    2, 
    15 
], [ 
    15, 
    15, 
    41 
]] 

私は

db.collection.find({}, {"items.a": true, "_id": false}) 

が返されることを知っている

[{ 
    items: [ 
    {a: 1}, 
    {a: 2}, 
    {a: 15} 
    ] 
}, { 
    items: [ 
    {a: 15}, 
    {a: 15}, 
    {a: 41} 
    ] 
}] 

これは私が探しているものではありません。

MongoDBで計算する価値があるのですか、それともPythonで計算できますか?

編集: そして私は、たとえばことによってそれを確認したい場合:items.aが含まれているすべてのリストを返す:1

ので、結果はあなたがすることができ、その場合には

[[ 
    1, 
    2, 
    15 
]] 
+0

'; – Veeram

答えて

1

する必要があります$map演算子を$groupパイプライン内で使用して、埋め込みドキュメントのマップされた要素の値の配列を作成する次の集計パイプラインを実行します。aフィールド:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": null, 
      "elements": { 
       "$push": { 
        "$map": { 
         "input": "$items", 
         "as": "item", 
         "in": "$$item.a" 
        } 
       } 
      } 
     } 
    } 
]) 

サンプル出力:

{ 
    "_id" : null, 
    "elements" : [ 
     [ 
      1, 
      2, 
      15 
     ], 
     [ 
      15, 
      15, 
      41 
     ] 
    ] 
} 

あなたは、あなただけの要素の1つは1の値を持っている、あなたはを配置する必要があるすべてのアイテムを返すようにしたい場合

のように、グループ化する前にフィルタ$matchをフィルタリングします。

あなたは `db.collection.distinct( "items.a"、{ "items.a":1})試みることができるサンプル出力

{ 
    "_id" : null, 
    "elements" : [ 
     [ 
      1, 
      2, 
      15 
     ] 
    ] 
} 
+0

そしてitems.a = 1で検索したい場合、結果は{"_id":null、 "elements":[[1,2、15]]}になりますか? –

+0

上記のアップデートのように、最初に '$ match'フィルタを含める必要があります。 – chridam

関連する問題