MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Sottrai $sum dal documento secondario

In realtà puoi semplicemente fare:

db.table.aggregate( [
  { "$match" : { "tenantId": "paul" } },
  //{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true  }},
  { "$project":
    "deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
  }}
])

Da MongoDB 3.2 puoi effettivamente $project con $sum e un array di argomenti (o un array) e quindi non è necessario $unwind affatto.

Il metodo "lungo", che è il "vecchio", consiste nell'utilizzare effettivamente $unwind , ma aggiungeresti effettivamente un $project seguendo il $group :

db.table.aggregate( [
  { "$match" : { "tenantId": "paul" } },
  { $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true  }},
  { "$group":
    "_id": "$_id",
    "price": { "$first": "$price" },
    "deposits": { "$sum": "$deposits.amount" }
  }},
  { "$project": {
    "deposits": { "$subtract": [ "$price", "$deposits" ] }
  }}
])

E ovviamente hai bisogno di $first accumulatore per restituire il "price" campo dal $group fase in modo che possa essere utilizzata nella fase successiva.

Ma se riesci a fare preserveNullAndEmptyArrays , allora hai effettivamente MongoDB 3.2, e quindi è meglio usare l'istruzione senza il $unwind affatto, dal momento che è molto più veloce farlo in questo modo.