実際には、次のことを簡単に行うことができます:
db.table.aggregate( [
{ "$match" : { "tenantId": "paul" } },
//{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true }},
{ "$project":
"deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
}}
])
MongoDB 3.2以降、実際には $ project
$ sum
引数の配列(または配列)であるため、 $ unwind
する必要はありません。 まったく。
「古い」方法である「長い」方法は、実際に $ unwind
、ただし、実際には $ project
>
$ 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" ] }
}}
])
そしてもちろん、 $ first
が必要です。
"price"
を返すためのアキュムレータ $ group
のフィールド
ステージなので、次のステージで使用できます。
ただし、 prepareNullAndEmptyArrays
を実行できる場合 、実際にはMongoDB 3.2を使用しているため、なしのステートメントを使用することをお勧めします。 $ unwind
とにかく、そうするほうがはるかに速いからです。