2

これはサンプル コレクションです。

{'f1': 10, '_id': 1, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]}
{'f1': 10, '_id': 2, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]}
{'f1': 77, '_id': 3, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]}

$sum(f1 + Σ[items.i1])上記のコレクションで計算される次のような式が必要です。以下は、私が思いつくことができるものです(pymongoで):

db.collec.aggregate([    
        { "$unwind" : "$items"},
    { "$group" : {    
             "_id" : {"key": "$key", "id": "$_id"},    
     "matches" : { "$sum" : "$items.i1" },    
     "extra" : { "$sum" : "$f1" },    
     "count" : {"$sum": 1}    
                    }},
    { "$group": {    
             "_id" : "$_id.key",     
             "finalSum":{ "$sum":    
                        { "$add": ["$matches", {"$divide":["$extra", "$count"]}]}}}}      
    ]);

出力:

{'finalSum': 187.0, '_id': 'g'}

これにより正しい出力が得られますが、これに対するより良い、より簡単な解決策があることを願っています。

4

1 に答える 1

3

ドキュメントをグループ化する場合、_id フィールドに「f1」を保存すると、ドキュメントごとにまとめて分割する必要がなくなります。

集計操作は次のようになります。

db.collec.aggregate([    
    { "$unwind" : "$items"},
    { "$group" : {    
          _id : {key: "$key", id: "$_id", f1 : "$f1" },    
          matches : { "$sum" : "$items.i1" },    
    }},
    { "$group": {    
          _id : "$_id.key",     
          finalSum : { "$sum":    
                        { "$add": ["$matches", "$_id.f1"]}}}}      
    ]);
于 2013-04-12T05:54:56.277 に答える