2017-01-19 9 views
0

私はキーと値のペアとして1つのフィールドを持つ簡単な文書を持っています。私はちょうどそれらのキーを介して集計でグループ操作を実行し、それらの値を追加したいです。しかし、ペアのキーは固定ではなく、何でもかまいません。MongoDB:動的キーと値のペアによる集約グループの操作

サンプルドキュメントです。

{ 
    _id: 349587843, 
    matchPair: { 
     3 : 21, 
     9 : 4, 
     7 : 32 
    } 
}, 
{ 
    _id: 349587478, 
    matchPair: { 
     7 : 11, 
     54 : 32, 
     9 : 7, 
     2 : 19 
    } 
} 

そして、次のような結果が欲しいです。

{ 
    _id : 3, 
    count : 21 
}, 
{ 
    _id : 9, 
    count : 11 
}, 
{ 
    _id : 7, 
    count : 43 
}, 
{ 
    _id : 54, 
    count : 32 
}, 
{ 
    _id : 2, 
    count : 19 
} 

私は心の中で次のクエリを持っていると$unwind操作を使用してみましたが、「matchPairは」アレイではないと私は$sum操作のために指定するかわからないので、それはおそらく動作しません。

db.MatchPairs.aggregate([ 
    { "$unwind" : "$matchPair" }, 
    { "$group" : { 
     _id: "$matchPair", 
     count : { $sum : $matchPair } 
    } } 
]); 

私はまた、地図-削減試みることができるが、それはあまりにも私は名前でemit()キーと値にする必要があります。

私はこれには単純な解決策があると確信していますが、私はそれを理解することはできません。 $unwindためMongoDBのドキュメントの

+0

キーが動的である場合、これは集約フレームワークでは不可能なので、mapReduceに行く必要があります。 – felix

+0

です。 'emit()'関数でキーと値を指定する方法を教えてください。 –

+0

類似の問題のマップの例を減らす:http://stackoverflow.com/a/41634637/2965883 – ares

答えて

0

を出力する入力文書から各要素の 文書をアレイフィールドを解体します。

だから、あなたのような何かのためにあなたのスキーマを変更する必要があります。

{ 
    "_id" : ObjectId("5880b57b039a3c89c1db145a"), 
    "matchPair" : [ 
     { 
      "_id" : "3", 
      "count" : 21 
     }, 
     { 
      "_id" : "9", 
      "count" : 4 
     }, 
     { 
      "_id" : "7", 
      "count" : 32 
     } 
    ] 
}, 
{ 
    "_id" : ObjectId("5880b58c039a3c89c1db145b"), 
    "matchPair" : [ 
     { 
      "_id" : "7", 
      "count" : 11 
     }, 
     { 
      "_id" : "54", 
      "count" : 32 
     }, 
     { 
      "_id" : "9", 
      "count" : 7 
     }, 
     { 
      "_id" : "2", 
      "count" : 19 
     } 
    ] 
} 

次にやって:

db.MatchPairs.aggregate([ 
    { $unwind : "$matchPair" } 
]); 

が返されます:

{ 
    "_id" : ObjectId("5880b57b039a3c89c1db145a"), 
    "matchPair" : { 
     "_id" : "3", 
     "count" : 21 
    } 
}, 
{ 
    "_id" : ObjectId("5880b57b039a3c89c1db145a"), 
    "matchPair" : { 
     "_id" : "9", 
     "count" : 4 
    } 
}, 
{ 
    "_id" : ObjectId("5880b57b039a3c89c1db145a"), 
    "matchPair" : { 
     "_id" : "7", 
     "count" : 32 
    } 
}, 
{ 
    "_id" : ObjectId("5880b58c039a3c89c1db145b"), 
    "matchPair" : { 
     "_id" : "7", 
     "count" : 11 
    } 
}, 
{ 
    "_id" : ObjectId("5880b58c039a3c89c1db145b"), 
    "matchPair" : { 
     "_id" : "54", 
     "count" : 32 
    } 
}, 
{ 
    "_id" : ObjectId("5880b58c039a3c89c1db145b"), 
    "matchPair" : { 
     "_id" : "9", 
     "count" : 7 
    } 
}, 
{ 
    "_id" : ObjectId("5880b58c039a3c89c1db145b"), 
    "matchPair" : { 
     "_id" : "2", 
     "count" : 19 
    } 
} 

次に、あなただけのしなければなりませんあなたのグループ。