sql >> Database >  >> NoSQL >> MongoDB

Trek $som af van subdocument

Eigenlijk kun je gewoon doen:

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

Sinds MongoDB 3.2 kun je eigenlijk $project met $sum en een array van argumenten ( of een array ) en hoeven daarom niet te $unwind helemaal niet.

De "lange" manier, wat de "oude" manier is, is om daadwerkelijk $unwind , maar je zou dan eigenlijk een $project volgens de $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" ] }
  }}
])

En natuurlijk heb je dan de $first nodig accumulator om de "prijs" . te retourneren veld uit de $group stadium zodat het in het volgende stadium kan worden gebruikt.

Maar als je preserveNullAndEmptyArrays . kunt doen , dan heb je eigenlijk MongoDB 3.2 en kun je daarom beter het statement zonder gebruiken de $unwind helemaal niet, omdat het veel sneller is om het op die manier te doen.




  1. Een aangepaste query maken met django-nonrel en mongodb

  2. Cast to Number mislukt voor waarde NaN (typenummer) bij pad op een berekend veld Mongoose

  3. Tijdens het opslaan van een verzameling maakt MongoDB een indexnaam die te lang is en de limiet van 127 bytes overschrijdt. Hoe dit op te lossen. kan ik indexering uitschakelen?

  4. Spring MongoDB-query sorteren