MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Subtrahieren Sie $sum vom Unterdokument

Eigentlich können Sie einfach Folgendes tun:

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

Seit MongoDB 3.2 können Sie tatsächlich $project mit $sum und ein Array von Argumenten ( oder ein Array ) und müssen daher nicht $unwind werden überhaupt.

Der "lange" Weg, der der "alte" Weg ist, ist die tatsächliche Verwendung von $unwind , aber Sie würden dann tatsächlich ein $project nach $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" ] }
  }}
])

Und natürlich benötigen Sie dann den $first Akkumulator, um den "Preis" zurückzugeben Feld aus $group Phase, damit es in der folgenden Phase verwendet werden kann.

Aber wenn Sie preserveNullAndEmptyArrays tun können , dann haben Sie tatsächlich MongoDB 3.2 und verwenden daher besser die Anweisung ohne der $unwind überhaupt nicht, da es so viel schneller geht.