MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Извадете $sum от поддокумента

Всъщност можете просто да направите:

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 етап, за да може да се използва в следващия етап.

Но ако можете да направите preserveNullAndEmptyArrays , тогава всъщност имате MongoDB 3.2 и затова е по-добре да използвате оператора без $unwind изобщо, тъй като е много по-бързо да го направите по този начин.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. как да изчислим броя и уникалния брой за две полета във функцията за намаляване на mongo

  2. Намирайте и заменете низове в документи ефективно

  3. Запазване в MongoDB в цикъл

  4. Mongodb преброява всички елементи на масива във всички обекти, съвпадащи по критерии

  5. Функцията за обратно извикване никога не се извиква след изпълнение на заявката на Mongoose