2015-05-04 21 views
7

Wir haben eine Gesamtabfrage, die nur wenige Unterdokumente projiziert. Wir wollten einige arithmetische Operationen wie Summe und Produkt auf diese projizierten Werte anwenden.MongoDB-Aggregat für arithmetische Operationen - Filialdokument

Aggregationsanfrage -

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); 
     } 
    }); 

dies ein Fehler gibt Angabe invalid operator '$sum'

Was sollten wir die Summe von original_y und new_y im $project erhalten tun?

EDIT

Dokumente:

{ 
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}, 
    ] 
} 

OUTPUT ERWARTET:

{ 
    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}, 
     ] 
    } 

wo tallyAmount = (original_y + new_y)/cost

FEHLER: kann nicht einen Ausdruck für einen Teil hinzufügen Feld von Dummy, weil es bereits einen Ausdruck gibt, der für das ganze Feld gilt

+0

@chridam Habe das Dokument und die erwartete Ausgabe aktualisiert. –

+0

Danke für das Update, ich habe meine Antwort unten aktualisiert, um die Änderungen zu übernehmen. – chridam

Antwort

5

Ohne viele Details Ihres Dokument-Schemas und das erwartete Aggregationsergebnis, würde ich vorschlagen, dass Sie die folgende Aggregation versuchen, da ich glaube, dass Sie den Operator $add brauchen der Operator $sum. Beachten Sie, dass der Operator $sum nur für den Operator gilt. Mit dem $add Operator, fügt es bis zwei Nummern/Felder zusammen und das Ergebnis wird in einem neuen Feld mit dem $project Operator gespeichert:

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); 

- UPDATE -

die Bedingung zu erfüllen 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); 
:, sollten Sie die $add und $divide arithmetischen Operatoren in Ihrem $ Projektbetreiber Pipeline-Stufe damit Ihre endgültige Aggregation Pipeline wie folgt aussehen würde verwenden
+1

Das einzige Problem ist, dass das 'TallyAmount' Feld innerhalb jedes 'Dummy' Filialdokuments sein muss. Ich stehe vor einem Fehler, von dem noch nie zuvor etwas gehört wurde! 'ERROR: kann keinen Ausdruck für ein Unterfeld von Dummy hinzufügen, da es bereits einen Ausdruck gibt, der für das gesamte Feld gilt. ' –

+0

@RohitLala Ok, ich habe meine Antwort mit der richtigen Aggregationspipeline aktualisiert, die die gewünschte berücksichtigt Ausgabe. – chridam

+1

Funktioniert wie ein Juwel! : D –

Verwandte Themen