MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Kurangi $sum dari Sub-dokumen

Sebenarnya Anda cukup melakukan:

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

Sejak MongoDB 3.2 Anda sebenarnya dapat $project dengan $sum dan array argumen ( atau array ) dan oleh karena itu tidak perlu $unwind sama sekali.

Cara "panjang", yang merupakan cara "lama" adalah dengan benar-benar menggunakan $unwind , tetapi Anda kemudian akan benar-benar menambahkan $project mengikuti $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" ] }
  }}
])

Dan tentu saja Anda memerlukan $first akumulator untuk mengembalikan "price" bidang dari $group tahap sehingga dapat digunakan pada tahap berikutnya.

Tetapi jika Anda dapat melakukan preserveNullAndEmptyArrays , maka Anda sebenarnya memiliki MongoDB 3.2, dan oleh karena itu lebih baik menggunakan pernyataan tanpa $unwind sama sekali, karena jauh lebih cepat melakukannya dengan cara itu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Perbarui atau tambahkan ke subkoleksi di mongo

  2. Parameter apa yang diteruskan ke panggilan balik Mongoose

  3. MongoDB pada Vagrant melalui masalah Port Forwarding

  4. Temukan menggunakan _id tidak berfungsi dengan agregasi

  5. Bson cukup mencetak menggunakan driver Java MongoDb