2016-06-24 12 views
2

のフィールドをカウントするためにどのように私はいくつかの文書が他の量の例を持っているこのはMongoDBの集計

{ 
    "_id": ObjectId("5644c495d0807a1750043237"), 
    "siteid": "123456" 
    "amount": 1.32 
} 

のようなエントリを持つ文書を持っています。 "cashbackAmount"

各金額欄にsumcountが必要です。すべての金額項目にすべての金額項目が含まれるわけではありません

私はそれが私の合計を与え、次の

{ 
    $group: { 
     "_id": "$siteid", 
     item2: { "$sum": "$amount" }, 
     item3: { "$sum": "$totalAmount" }, 
     item4: { "$sum": "$cashbackAmount" }, 
     item5: { "$sum": "$unitPrice" }, 
    } 
} 

を試してみましたhjaveが、私は、各金額フィールドが存在している数時間を取得する方法を考え出すことはできません。

{ "$sum": 1 }これは、私に合計フィールドのいずれかを持つすべてのドキュメントを提供するため、機能しません。

+0

「各金額フィールドが存在する回数を取得する」とはどういう意味ですか?いくつかの期待される出力例を挙げることができますか? – Shrabanee

答えて

1

をそのようなもの

db.getCollection('amounts').aggregate([ 
    { 
     $project: { 
      siteid: 1, 
      amount: 1, 
      totalAmount: 1, 
      unitPrice: 1, 
      cashbackAmount: 1, 
      amountPresent: { 
       $cond: { 
        if: "$amount", 
        then: 1, 
        else: 0 
       } 
      }, 
      totalAmountPresent: { 
       $cond: { 
        if: "$totalAmount", 
        then: 1, 
        else: 0 
       } 
      }, 
      cashbackAmountPresent: { 
       $cond: { 
        if: "$cashbackAmount", 
        then: 1, 
        else: 0 
       } 
      }, 
      unitPricePresent: { 
       $cond: { 
        if: "$unitPrice", 
        then: 1, 
        else: 0 
       } 
      } 
     } 
    }, 
    { 
     $group: { 
      "_id": "$siteid", 
      amountSum: { "$sum": "$amount" }, 
      amountCount: { "$sum": "$amountPresent" }, 
      totalAmountSum: { "$sum": "$totalAmount" }, 
      totalAmountCount: { "$sum": "$totalAmountPresent" }, 
      cashbackAmountSum: { "$sum": "$cashbackAmount" }, 
      cashbackAmountCount: { "$sum": "$cashbackAmountPresent" }, 
      unitPriceSum: { "$sum": "$unitPrice" }, 
      unitPriceCount: { "$sum": "$unitPricePresent" } 
     } 
    } 
]) 
+0

ありがとうございました – user3782299

+0

あなたに役立った回答を投票してください(私だけでなく):) – DAXaholic

+0

私は評判を得るときに行います – user3782299

1

金額フィールドが事前に分かっている場合は、パイプラインを動的に作成する単一の集計操作でこれを行うことができます。

次のデモンストレーションチェックアウト:私はあなたがおそらくワン推測

var amountFields = ["amount", "totalAmount", "cashbackAmount", "unitPrice"], 
    groupOperator = { "$group": { "_id": "$siteid" } }; 

amountFields.forEach(function (field){ 
    groupOperator["$group"][field+"Total"] = { "$sum": "$"+field }; 
    groupOperator["$group"][field+"Count"] = { 
     "$sum": {    
      "$cond": [ { "$gt": [ "$"+field, null ] }, 1, 0 ] 
     } 
    }; 
}); 

db.test.aggregate([groupOperator]); 

移入テストドキュメント

db.test.insert([ 
    { 
     "siteid": "123456", 
     "amount": 1.32 
    }, 
    { 
     "siteid": "123456", 
     "cashbackAmount": 8.32 
    }, 
    { 
     "siteid": "123456", 
     "cashbackAmount": 9.74 
    }, 
    { 
     "siteid": "123456", 
     "unitPrice": 0.19 
    }, 
    { 
     "siteid": "123456", 
     "amount": 27.8, 
     "totalAmount": 15.22, 
     "unitPrice": 5.10, 
     "cashbackAmount": 43.62  
    }, 
    { 
     "siteid": "123456", 
     "unitPrice": 5.07 
    }, 
    { 
     "siteid": "123456", 
     "amount": 12.98, 
     "totalAmount": 32.82 
    }, 
    { 
     "siteid": "123456", 
     "amount": 6.65, 
     "unitPrice": 5.10 
    } 
]) 

サンプル集約出力

{ 
    "_id" : "123456", 
    "amountTotal" : 48.75, 
    "amountCount" : 4, 
    "totalAmountTotal" : 48.04, 
    "totalAmountCount" : 2, 
    "cashbackAmountTotal" : 61.68, 
    "cashbackAmountCount" : 3, 
    "unitPriceTotal" : 15.46, 
    "unitPriceCount" : 4 
} 
+0

ありがとうございました "$ cond":[{"$ gt":["$" + field、null]}、1、0] – user3782299