MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Soustraire $sum du sous-document

En fait, vous pouvez simplement faire :

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

Depuis MongoDB 3.2, vous pouvez en fait $project avec $sum et un tableau d'arguments (ou un tableau) et n'ont donc pas besoin de $unwind du tout.

La "longue", qui est l'"ancienne", consiste à utiliser $unwind , mais vous ajouteriez alors en fait un $project suivant le $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" ] }
  }}
])

Et bien sûr, vous avez ensuite besoin du $first accumulateur afin de retourner le "price" champ du $group afin qu'il puisse être utilisé dans l'étape suivante.

Mais si vous pouvez faire preserveNullAndEmptyArrays , alors vous avez réellement MongoDB 3.2, et il vaut donc mieux utiliser l'instruction sans le $unwind du tout, car c'est beaucoup plus rapide de le faire de cette façon.