2016-04-01 10 views
-2

内部配列からの合計値の計算方法は?上記のコレクションの店で

{ 
 
    "_id" : ObjectId("56fb04fd2e6bb8bc059287c9"), 
 
    "BillNo" : "Bill_001", 
 
    "DateP" : "12-12-2015", 
 
    "Type" : "Cash", 
 
    "Items" : [ 
 
     { 
 
      "id" : NumberInt(1), 
 
      "ItemName" : "cement", 
 
      "Qty" : "100", 
 
      "Rate" : "10", 
 
      "Total" : "1000" 
 
     }, 
 
     { 
 
      "id" : NumberInt(2), 
 
      "ItemName" : "steel", 
 
      "Qty" : "10", 
 
      "Rate" : "50", 
 
      "Total" : "500" 
 
     }, 
 
     { 
 
      "id" : NumberInt(3), 
 
      "ItemName" : "sand", 
 
      "Qty" : "1", 
 
      "Rate" : "1500", 
 
      "Total" : "1500" 
 
     } 
 
    ] 
 
} 
 
{ 
 
    "_id" : ObjectId("56fb05382e6bb8bc059287ca"), 
 
    "BillNo" : "Bill_002", 
 
    "DateP" : "12-10-2015", 
 
    "Type" : "Cash", 
 
    "Items" : [ 
 
     { 
 
      "id" : NumberInt(1), 
 
      "ItemName" : "Paint", 
 
      "Qty" : "50", 
 
      "Rate" : "100", 
 
      "Total" : "5000" 
 
     }, 
 
     { 
 
      "id" : NumberInt(2), 
 
      "ItemName" : "Brush", 
 
      "Qty" : "5", 
 
      "Rate" : "10", 
 
      "Total" : "50" 
 
     } 
 
    ] 
 
}

メイン文書とそのアイテムのすべての購入の詳細メインitem.Iの内側の配列は、MongoDBのを使用して、次のような結果を得るために必要として保存する詳細。 mongodbの内部配列からtotalを見つける方法MongoDBの中に理想的

Bill_001  1500 
Bill_002  5050 
+1

文字列のすべての自分の価値観:

理想的には、このようにそれを修正することができます。実際に文字列を一緒に追加することはできないので、修正する必要があります。 –

+0

結果はBill_001 - > 3000、Bill_002 - > 5050 – Pradeep

+0

のようになります。それがintに変更された場合、mongoシェルはどのようになりますか? – Pradeep

答えて

1

あなたは$groupアキュムレータの両方として$sum$mapを使用することができますし、それが提供する、アレイのメンバーの追加に新しい役割です:ドキュメントあたり

db.collection.aggregate({ 
    { "$group": { 
     "_id": "$BillNo", 
     "Total": { 
      "$sum": { 
       "$sum": { 
        "$map": { 
        "input": "$Items", 
        "as": "item", 
        "in": "$$item.Total" 
        } 
       } 
      } 
     } 
    }} 
}) 

それともを:

$firstの他のアキュムレータを使用します。もちろん、あなたは本当にただ$projectのMongoDB 3.2でできます。古いバージョンでは

db.collection.aggregate({ 
    { "$project": { 
     "BillNo": 1, 
     "DateP": 1, 
     "Type": 1, 
     "Total": { 
      "$sum": { 
       "$map": { 
       "input": "$Items", 
       "as": "item", 
       "in": "$$item.Total" 
       } 
      } 
     } 
    }} 
}) 

あなたはまだ最初の配列に$unwindが必要になります。

db.collection.aggregate([ 
    { "$unwind": "$Items" }, 
    { "$group": { 
     "_id": "$BillNo", 
     "Total": { 
      "$sum": "$Items.Total" 
     } 
    }} 
]) 

それともあなただけの文書ごとに追加している場合:

db.collection.aggregate([ 
    { "$unwind": "$Items" }, 
    { "$group": { 
     "_id": "_id", 
     "BillNo": { "$first": "$BillNo" }, 
     "DateP": { "$first": "$DateP" }, 
     "Type": { "$first": "$Type" }, 
     "Total": { 
      "$sum": "$Items.Total" 
     } 
    }} 
]) 

もちろん、実際には文字列を数値に修正しただけです。

var ops = []; 

db.collection.find().forEach(function(doc) { 
    doc.Items.forEach(function(item) { 
     ops.push({ 
      "updateOne": { 
       "filter": { "_id": doc._id, "Items.id": item.id }, 
       "update": { 
        "$set": { 
         "Items.$.Qty": parseInt(item.Qty), 
         "Items.$.Rate": parseInt(item.Rate), 
         "Items.$Total": parseInt(item.Total) 
        } 
       } 
      }   
     }); 

     // Send batch of updates 
     if (ops.length == 1000) { 
      db.collection.bulkWrite(ops); 
      ops = []; 
     } 
    }) 
}); 

// Clear any unprocessed updates 
if (ops.length > 0) { 
    db.collection.bulkWrite(ops); 
} 
+0

ありがとうございました。私がBillNo、Date、Type ..などを表示したい場合は、 "Total"と一緒にどのように表示されるのか。私は$ unwindメソッドを使用しています。 plzこれも返信 – Pradeep

+0

@Pradeepあなたの質問に尋ねるものではありません。ようこそstackoverflowに、あなたは一度にここで1つの質問をすると、別の質問があるとき[[別の質問をする](http://stackoverflow.com/questions/ask))。 '' BillNo ''の値を "蓄積"するように要求しているので、これは '' Type ''などの値がドキュメントごとに変更され、グループ化の一部ではないことを意味します。他の[accumulators](https://docs.mongodb.org/manual/reference/operator/aggregation-group/)を使用することはできますが、これはあなたの質問の一部ではありません。 –

関連する問題