2015-05-04 20 views
7

Birkaç alt belgeyi yansıtan bir toplu sorgumuz var. Bu öngörülen değerler hakkında Sum ve Ürün gibi birkaç aritmetik işlem uygulamak istedik.Aritmetik İşlemler için MongoDB toplaması - Subdocument Alanı

Toplama Sorgusu - Bu bildiren bir hata veriyor

Item.aggregate([ 
     { $unwind: '$dummy'},  
     { $match: {'dummy.storage': {$gt: 0}} }, 
     { $group: {_id: '$_id', 
        dummy: {$push: '$dummy'}, 
        original_y: { $first: "$original_y" }, 
        new_y: { $first: "$new_y" }, 

     }}, 
     {$project:{ 
        original_y: 1, new_y: 1, 
        tallyAmount: {$sum: ["$new_y","$original_y"] } 
       } 
     }, 
    ] 
    ) 
    .exec(function(err, results){ 
     if(err) 
     { 
      console.log("Error : " + err); 
      return res.json ({error: "Error"}); 

     } 
     else if(!(results) || results == null || results.length == 0) 
     { 
      console.log("No Results Found"); 
      return res.json ({error: "No Results Today"}); 

     }else{ 

      res.send(results); 
     } 
    }); 

invalid operator '$sum'

biz $project içinde original_y ve new_y toplamını almak için ne yapmalıyım?

DÜZENLEME

Belgeler:

{ 
id:1, 
original_y: 200, 
new_y: 140, 
dummy: [ 
    {id:1, storage:2, cost: 10}, 
    {id:2, storage:0, cost: 20}, 
    {id:3, storage:5, cost: 30}, 
    ] 
} 

ÇIKIŞ BEKLENEN:

{ 
    id:1, 
    original_y: 200, 
    new_y: 140, 
    dummy: [ 
     {id:1, storage:2, cost: 10, tallyAmount: 34}, 
     {id:3, storage:5, cost: 30, tallyAmount: 11.33}, 
     ] 
    } 

, tallyAmount = (original_y + new_y)/cost

HATA: Bir alt için bir ifade ekleyemezsiniz kukla alanı olduğu için zaten tüm alan için geçerli bir ifade var

+0

@chridam Belge ve Beklenen Çıkışlar güncellendi –

+0

Güncelleme için teşekkürler, değişiklikleri dahil etmek için aşağıdaki cevabımı güncelledim. – chridam

cevap

5

Belge şemasının ve beklenen toplama sonucunun fazla bir ayrıntı olmadan, aşağıdaki toplama işlemini öneririm, çünkü $add işleci yerine $sum işleci. $sum operatörünün yalnızca $group operatörüne uygulanabileceğini unutmayın. $add operatörü ile, birlikte iki sayı/alanları ekler ve sonuç $project operatörü ile yeni bir alanda depolanır:

Item.aggregate([ 
    { "$match": { "dummy.storage": { "$gt": 0 } } }, 
    { "$unwind": "$dummy" }, 
    { "$group": { 
     "_id": "$_id", 
     "original_y": { "$first": "$original_y" }, 
     "new_y": { "$first": "$new_y" } 
    } }, 
    { "$project": { 
     "original_y": 1, 
     "new_y": 1, 
     "tallyAmount": { "$add": [ "$new_y", "$original_y" ] } 
    } } 
]).exec(callback); 

- GÜNCELLEME - koşulunu karşılamak için

tallyAmount = (original_y + new_y)/cost

Item.aggregate([ 
    { "$match": { "dummy.storage": { "$gt": 0 } } }, 
    { "$unwind": "$dummy" }, 
    { 
     "$project": { 
      "original_y": 1, 
      "new_y": 1, 
      "dummy.id": "$dummy.id", 
      "dummy.storage": "$dummy.storage", 
      "dummy.cost": "$dummy.cost", 
      "dummy.tallyAmount": { 
       "$divide": [ 
        { "$add": ["$new_y","$original_y"] }, 
        "$dummy.cost" 
       ] 
      } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "_$id", 
      "original_y": { "$first": "$original_y" }, 
      "new_y": { "$first": "$new_y" }, 
      "dummy": { 
       "$addToSet": "$dummy" 
      } 
     }   
    } 
]).exec(callback); 
:, nihai toplama boru hattı şu şekilde görünecektir böylece $ proje operatör boru hattı aşamasında $add ve $divide aritmetik operatörleri kullanmalıdır
+1

Tek sorun, 'tallyAmount' alanının her 'kukla' alt dokümanı INSIDE olması gerektiğidir. Daha önce hiç duyulmamış bir hatayla karşılaşıyorum! 'HATA: bir alanın tamamı için bir ifade eklenemiyor çünkü zaten tüm alan için geçerli olan bir ifade var ' –

+0

@RohitLala Tamam, cevabımı istenen toplama dikkate alınarak doğru toplama hattıyla güncelledim çıktı. – chridam

+1

Bir mücevher gibi çalışır! : D –