2017-10-20 2 views
1

J'ai facture modèle comme suitSomme avec le calcul à partir d'éléments sous-document

{ 
... 

"itemDetails": [ 
      { 
       "item": "593a1a01bbb00000043d9a4c", 
       "purchasingPrice": 100, 
       "sellingPrice": 150, 
       "qty": 200, 
       "_id": "59c39c2a5149560004173a05", 
       "discount": 0 
      } 
     ], 
     "payments": [], 
... 

} 

Je dois calculer l'article Etau somme totale ou le prix de vente - escompte.

je vis opérateur $sum mais ne pouvait pas trouver un moyen de groupe avec item._id

+0

Groupe ou par élément de tableau? Parce que '" item._id "' implique que vous voulez dire pour chaque élément du tableau. –

+0

J'aurai de nombreuses factures et chacun d'entre eux comme articleDetails je dois obtenir l'article vice vente. – user2473015

Répondre

1

Si vous cherchez à obtenir un total groupé par une propriété « à l'intérieur » un tableau, vous devez toujours $unwind. Si vous devez appliquer "math" avant d'accumuler via $sum, utilisez le math operators. Tels que $subtract dans ce cas:

Model.aggregate([ 
    { "$unwind": "$itemDetails" }, 
    { "$group": { 
    "_id": "$itemDetails.item", 
    "salePrice": { 
     "$sum": { 
     "$subtract": [ "$itemDetails.sellingPrice", "$itemDetails.discount" ] 
     } 
    } 
    }} 
]) 

Présumant bien sûr que itemDetails.item est en fait commun aux articles dans différentes factures.

+0

il doit être '" _id ":" $ itemDetails.item " – user2473015

+1

@ user2473015 Eh bien, il était correct avant de vous [a changé la structure de votre question] (https://stackoverflow.com/revisions/46844005/3). Vous aviez précédemment 'item' comme sous-document avec ses propres propriétés. Vous ne devriez vraiment pas changer votre question comme ça une fois qu'il y a déjà une réponse, parce que le contexte est perdu. Vous devriez inverser la structure dans la question même si vous avez besoin de changer votre implémentation réelle. –

+0

oui. J'ai ajouté la structure peuplée précédemment. Désolé. – user2473015