MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Trừ $ sum khỏi tài liệu con

Trên thực tế, bạn chỉ có thể làm:

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

Kể từ MongoDB 3.2, bạn thực sự có thể $project với $sum và một mảng đối số (hoặc một mảng) và do đó không cần $unwind ở tất cả.

Cách "dài", là cách "cũ" là thực sự sử dụng $unwind , nhưng sau đó bạn sẽ thực sự thêm một $project theo dõi $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" ] }
  }}
])

Và tất nhiên sau đó bạn cần $first tích lũy để trả lại "price" từ trường $group để nó có thể được sử dụng trong giai đoạn sau.

Nhưng nếu bạn có thể thực hiện preserveNullAndEmptyArrays , thì bạn thực sự có MongoDB 3.2 và do đó tốt hơn nên sử dụng câu lệnh without the $unwind chút nào, vì làm theo cách đó nhanh hơn nhiều.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongo db (mongodb.service) không thành công, trạng thái 14

  2. Cấu trúc liên kết Mông Cổ nodejs bị phá hủy

  3. Thực hiện các phép nối trong mongodb với ba bộ sưu tập?

  4. Tìm nhiều từ với find () trong MongoDB

  5. rmongodb:sử dụng $ hoặc trong truy vấn