node.js - mongodb 中的 $add,$subtract 聚合框架

标签 node.js mongodb aggregation-framework

嗨,我提到的是示例数据 ///集合-测试////

{
        "_id" : {
                "date" : ISODate("2020-02-11T17:00:00Z"),
                "userId" : ObjectId("5e43e5cdc11f750864f46820"),
                "adminId" : ObjectId("5e43de778b57693cd46859eb")
        },
        "outstanding" : 212.39999999999998,
        "totalBill" : 342.4,
        "totalPayment" : 130
}
{
        "_id" : {
                "date" : ISODate("2020-02-11T17:00:00Z"),
                "userId" : ObjectId("5e43e73169fe1e3fc07eb7c5"),
                "adminId" : ObjectId("5e43de778b57693cd46859eb")
        },
        "outstanding" : 797.8399999999999,
        "totalBill" : 797.8399999999999,
        "totalPayment" : 0
}

我需要构造一个执行以下操作的查询 -

  1. 我需要计算实际未结金额:[(totalBill+outstanding)-totalPayment],

  2. 我需要根据{"_id": {"date","userId", "adminId"}}将这个actualOutstanding保存在同一个集合和同一个文档中

    注意:两个文档中的userId 不同。

最佳答案

在 Mongo 4.2+ 版本中引入 pipelined updates ,这意味着我们现在可以使用聚合表达式来更新文档。

db.collection.updateOne(
    {
       "adminId" : ObjectId("5e43de778b57693cd46859eb")
       '_id."userId" : ObjectId("5e43e73169fe1e3fc07eb7c5"),
       '_id.date': ISODate("2020-02-11T18:30:00Z"),
    },
    [
        { '$set': { 
              actualOutstanding: {
                  $subtract:[ {$add: ['$totalBill','$outstanding']},'$totalPayment']
             }
        } }
    ]);

对于任何其他 Mongo 版本,您必须将其分为 2 个操作,首先查询并计算,然后使用计算更新文档。

关于node.js - mongodb 中的 $add,$subtract 聚合框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60373006/

相关文章:

node.js - 如何聚合数组中 ObjectID 出现的次数?

mongodb - 如何使用 MongoDB 过滤子文档中的数组

node.js - 当有人调用 API 时,socket.io 会发出信号

node.js - NodeJS : need to obtain reference to existing server or to close it

node.js - 将 lambda zip 上传到 s3 时,压缩方法重要吗?

mongodb - 从另一个文档的 preUpdate Hook 保存一个 Doctrine 文档的更新?

javascript - 为 mongo 运行 JavaScript 文件访问字段值的正确语法是什么

Node.js 和 MongoDB 时区问题 驱动程序未正确转换 UTC?

javascript - 延迟的 promise 链不起作用

python - Pymongo 和聚合框架查询