2017-02-26 5 views
0

このクエリで親切にお手伝いできますか?下の文書のqtyフィールドの合計はどのようにして得られますか?私はあなたがpriceageなどにアクセスしているときに動作するように見えるコードを書いたが、サブドキュメントにアクセスしているときはうまく動作しないようだ。ここではtotal = 0`となります。サブ文書+ MongoDB + Javascriptのフィールドを合計するにはどうすればいいですか?

ドキュメント:

{ 
"_id" : ObjectId("50a8240b927d5d8b5891743c"), 
"cust_id" : "abc123", 
"status" : "A", 
"price" : 75, 
"age" : 24, 
"ord_date" : "02/02/2012", 
"items" : [ 
    { 
     "sku" : "mmm", 
     "qty" : 5, 
     "price" : 2.5 
    }, 
    { 
     "sku" : "nnn", 
     "qty" : 500, 
     "price" : 50 
    } 
] 

}

CODE:

exports.test = function(collection, callback) { 

MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    db.collection(collection).aggregate(

     { 
      $match : { "price" : { $gt: 70, $lt: 90 }} 
     }, 
     { 
      $group : { total: { $sum: "$items.qty" }} 
     }, 
    function(err, result) { 
     console.log("result",result); 
     if (result) { 
      callback(result); 
     } else { 
      callback(false); 
     } 
    }); 
}); 
} 

あなたの助けに感謝!

は、あなたがグループ化する前{$unwind items}を追加する必要があり、

答えて

0

、ありがとうございました。それはトリックを行う必要があります。コマンドプロンプトから使用されている場合

+0

私はあなたから提案されたコードを挿入しましたが、残念ながらそれは動作しませんでした。 db.collection(コレクション).aggregate( { $アンワインド: "$アイテム" }、 { $マッチ:{ "価格":{$ GT:70、$のLT:90}} }一致 –

+0

アンワインド:( { $マッチ:{ "価格":{$ GT:70、$のLT:90}} }。、 { $アンワインド: "$アイテム" } 、 { $ group:{合計:{$ sum: "$ items.qty"}} } –

+0

結果はまだ未定義である後 –

0

これは動作するはずです: -

db.inventory.aggregate([ 
{$unwind: "$items"}, 
{$match: {"items.price" : { $gt: 70, $lt: 90 }}}, 
{$group:{_id:"$_id","total": {$sum:"$items.price"}}} 
]) 
1

はアンワインド機能でこれを試してみてください。

exports.test = function(collection, callback) { 

MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 
    db.collection(collection).aggregate(
     {$unwind: "$items"} , 
     { 
      $match : { "items.price" : { $gt: 70, $lt: 90 }} 
     }, 
     { 
      $group : { _id:null,total: { $sum: "$items.qty" }} 
     }, 
    function(err, result) { 
     console.log("result",result); 
     if (result) { 
      callback(result); 
     } else { 
      callback(false); 
     } 
    }); 
}); 
} 
関連する問題