2016-12-04 17 views
0

私は、フォーム内のデータを持っている:MongoDBの合計を配列のデータに従って集計する方法

{ 
    "_id": 1, 
    "array": [{ 
     "who": "jon", 
     "whom": "max", 
     "point": 2, 
     "description": "la-la" 
    }] 
} { 
    "_id": 2, 
    "array": [{ 
     "Id": "jon", 
     "ToId": "peter", 
     "point": 3, 
     "description": "la-la" 
    }] 
} { 
    "_id": 3, 
    "array": [{ 
     "Id": "peter", 
     "ToId": "max", 
     "point": 2, 
     "description": "la-la" 
    }] 
} { 
    "_id": 4, 
    "array": [{ 
     "Id": "max", 
     "ToId": "peter", 
     "point": 3, 
     "description": "la-la" 
    }] 
} 

私はarrayコマンドからデータを取った:形式のデータ

{"ToId" : "peter", "pointCount" : 6} 
{"ToId" : "max", "pointCount" : 4} 

を取得する方法

db.game.aggregate([{$project: {_id: false, array: true}}, {$unwind: "$array"}]) 

{ "array" : { "Id" : "jon", "ToId" : "max", "pointCount" : 2, "description" : "la-la" } } 
{ "array" : { "Id" : "jon", "ToId" : "peter", "pointCount" : 3, "description" : "la-la" } } 
{ "array" : { "Id" : "peter", "ToId" : "max", "pointCount" : 2, "description" : "la-la" } } 
{ "array" : { "Id" : "max", "ToId" : "peter", "pointCount" : 3, "description" : "la-la" } } 

ありがとうございました。

+0

あなたはToIdでグループ化して合計を計算するだけで済みます。 db.game.aggregate([{$ unwind: "$ array"}、{$ group:{"_ id": "$ array.ToId"、 "pointCount":{$ sum: "$ pointCount"}}}、{ $ project:{"_id":0、 "ToId": "$ _ id"、 "pointCount":1}}]) – Veeram

+0

ありがとう、それは – Garazd

答えて

0

arrayコマンドのデータは入力とは異なります。入力があれば、次のクエリが機能します。

db.game.aggregate([ 
{$unwind: "$array"}, 
{$group:{"_id" : "$array.ToId", "pointCount": {$sum:"$array.point"}}}, 
{$project: {_id: 0, "ToId":"$_id", "pointCount": 1}} 
]) 
+0

ありがとう、それは動作します。 どこに詳細を見ることができるか、これらの機能について読むことができます – Garazd

+0

これは、すべての配列を削除してより大きな配列にすることです。そして、この大規模な配列グループ操作では、groupby節に似ています。その後、あなたは予測をします(どのように表現したいかの状態)。これら3つのプロセスはすべてパイプラインで行われます。したがって、一方の入力は他方に与えられます。彼らはすべて適切に文書化されています。https://docs.mongodb.com/v3.2/reference/operator/aggregation/group/ – user1211

+0

ありがとう私は読むでしょう – Garazd

関連する問題