sql >> Databáze >  >> NoSQL >> MongoDB

Odečtěte $sum od dílčího dokumentu

Ve skutečnosti můžete jednoduše:

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

Od MongoDB 3.2 můžete skutečně $project s $sum a pole argumentů (nebo pole), a proto není nutné $unwind vůbec.

"Dlouhá" cesta, což je "stará" cesta, je skutečně použít $unwind , ale ve skutečnosti byste přidali $project podle $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" ] }
  }}
])

A samozřejmě pak potřebujete $first akumulátor, aby se vrátila "price" pole ze $group fázi, takže ji lze použít v následující fázi.

Ale pokud můžete udělat preserveNullAndEmptyArrays , pak ve skutečnosti máte MongoDB 3.2, a proto je lepší použít příkaz bez the $unwind vůbec, protože je to mnohem rychlejší udělat to tímto způsobem.




  1. MongoDB Jak získáme všechny AKTUÁLNÍ otevřené kurzory a dotazy, které spouštějí?

  2. Parametr projekce MongoDB nefunguje v findOne()

  3. Wonder:Je MongoDB _id ve výchozím nastavení jedinečné?

  4. Chyba MongoDB 3.0.5:chyba při vyhledávání symbolu:nedefinovaný symbol:FIPS_mode_set