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

Træk $sum fra underdokument

Faktisk kan du ganske enkelt gøre:

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

Siden MongoDB 3.2 kan du faktisk $project med $sum og en matrix af argumenter ( eller en matrix ) og behøver derfor ikke $unwind overhovedet.

Den "lange" vej, som er den "gamle" måde, er faktisk at bruge $unwind , men du ville faktisk tilføje et $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" ] }
  }}
])

Og så har du selvfølgelig brug for $first akkumulator for at returnere "price" feltet fra $group trin, så det kan bruges i det følgende trin.

Men hvis du kan gøre preserveNullAndEmptyArrays , så har du faktisk MongoDB 3.2, og derfor er det bedre at bruge sætningen uden $unwind overhovedet, da det er meget hurtigere at gøre det på den måde.




  1. Opdater objekt inde i arrayet i mongoDb ved hjælp af mongoose

  2. MongoDB ikke autoriseret til forespørgsel - kode 13

  3. Er der nogen anbefalet værdi af COUNT for SCAN / HSCAN kommando i REDIS?

  4. Der findes ingen egenskab for type... Ved brug af QueryDslPredicateExecutor med MongoDB og Spring-Data