sql >> Databasteknik >  >> NoSQL >> MongoDB

Subtrahera $summa från underdokument

Egentligen kan du helt enkelt göra:

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

Sedan MongoDB 3.2 kan du faktiskt $project med $sum och en array av argument ( eller en array ) och behöver därför inte $unwind överhuvudtaget.

Den "långa" vägen, som är det "gamla" sättet är att faktiskt använda $unwind , men du skulle då faktiskt lägga till ett $project efter $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" ] }
  }}
])

Och naturligtvis behöver du sedan $first ackumulator för att returnera "price" fältet från $group steg så att det kan användas i nästa steg.

Men om du kan göra preserveNullAndEmptyArrays , då har du faktiskt MongoDB 3.2, och därför är det bättre att använda satsen utan $unwind alls, eftersom det går mycket snabbare att göra det på det sättet.




  1. Ta bort en nyckel från ett MongoDB-dokument med Mongoose

  2. Mongodb datastatistikvisualisering med matplotlib

  3. Mongotemplate - Fråga ObjectId enligt operatorn större än (gt) eller mindre än (lt).

  4. MongoDB-skärning, hur balanserar den om när man lägger till nya noder?