I'm moving my first steps into MongoDB but I'm having difficulties into writing complex queries.
I have several items like this in my collection:
{ "_id" : "sku001", "deposits" : [ { "deposit_id" : "deposit01", "total" : "3", "sizes" : [ { "size" : "36", "stock" : "2" }, { "size" : "38", "stock" : "0" }, { "size" : "40", "stock" : "0" }, { "size" : "42", "stock" : "0" }, { "size" : "44", "stock" : "0" }, { "size" : "46", "stock" : "1" }, { "size" : "48", "stock" : "0" }, { "size" : "50", "stock" : "0" }, { "size" : "52", "stock" : "0" } ] }, { "deposit_id" : "deposit02", "total" : "5", "sizes" : [ { "size" : "36", "stock" : "1" }, { "size" : "38", "stock" : "1" }, { "size" : "40", "stock" : "0" }, { "size" : "42", "stock" : "1" }, { "size" : "44", "stock" : "0" }, { "size" : "46", "stock" : "1" }, { "size" : "48", "stock" : "1" }, { "size" : "50", "stock" : "0" }, { "size" : "52", "stock" : "0" } ] }, { "deposit_id" : "deposit03", "total" : "2", "sizes" : [ { "size" : "36", "stock" : "1" }, { "size" : "38", "stock" : "0" }, { "size" : "40", "stock" : "0" }, { "size" : "42", "stock" : "1" }, { "size" : "44", "stock" : "0" }, { "size" : "46", "stock" : "0" }, { "size" : "48", "stock" : "0" }, { "size" : "50", "stock" : "0" }, { "size" : "52", "stock" : "0" } ] }, { "deposit_id" : "deposit04", "total" : "0", "sizes" : [ { "size" : "36", "stock" : "0" }, { "size" : "38", "stock" : "0" }, { "size" : "40", "stock" : "0" }, { "size" : "42", "stock" : "0" }, { "size" : "44", "stock" : "0" }, { "size" : "46", "stock" : "0" }, { "size" : "48", "stock" : "0" }, { "size" : "50", "stock" : "0" }, { "size" : "52", "stock" : "0" } ] } ] }
and would like to write a query which will output this resulting document:
{ "_id" : "sku001", "total": 10, "sizes" [ { "size" : "36", "stock" : "4" }, { "size" : "38", "stock" : "1" }, { "size" : "40", "stock" : "0" }, { "size" : "42", "stock" : "2" }, { "size" : "44", "stock" : "0" }, { "size" : "46", "stock" : "2" }, { "size" : "48", "stock" : "1" }, { "size" : "50", "stock" : "0" }, { "size" : "52", "stock" : "0" } ] }
so that:
- total is the sum the "total" field in each deposit
- sizes is the resulting array given from the sum of the same size in each deposit
I know that I need to use aggregate()
with $unwind
, $group
and maybe $project
, but I don't understand how and in which order.
Can you help me? I'm using MongoDB version 3.4.3