node.js - 聚合结果,仅当条件为真时求和

标签 node.js mongodb mongoose

我正在尝试获取 $revenue所有值的总和,以及仅当 $user 等于时的计数我在调用此函数时传递的用户参数。

this.aggregate([
    { $match: { createdAt: { $gte: start, $lte: end }, 'status.verified': true } },
    { 
      $group: { 
        _id: null,
        balance: {
          $sum: "$revenue"
        },
        count: {
          $cond: { 
            if: { $eq: [ "$user", user ] }, 
            then: { $sum: 1 },
            else: { $sum: 0 }
          }
        }
      }
    }
  ], next);

我期望数据如下所示:

[ { _id: null, balance: 1287, count: 10 ] }

其中余额是匹配查询中所有收入字段的总和,计数是用户对数据贡献的计数。

如果我无条件地对计数求和(例如像这样),效果很好

this.aggregate([
    { $match: { createdAt: { $gte: start, $lte: end }, 'status.verified': true } },
    { 
      $group: { 
        _id: null,
        balance: {
          $sum: "$revenue"
        },
        count: { $sum: 1 }
      }
    }
  ], next);

这表明错误出在我的条件总和上。 MongoDB抛出的错误是

TypeError: Cannot read property '0' of undefined
    at redacted:10:20
    at redacted/node_modules/mongoose/lib/aggregate.js:529:13

我的架构是

var schema = new Schema({
  user: { type: Schema.Types.ObjectId, ref: 'User' },

  status: {
    verified: { type: Boolean, default: false },
    completed: { type: Boolean, default: false },
    canceled: { type: Boolean, default: false },
    refused: { type: Boolean, default: false }
  },

  meta: { type: Schema.Types.Mixed, default: {} },
  revenue: { type: Number, default: 0 }
});

注意:$match 中使用的 createdAt 值由插件自动插入。

最佳答案

$cond 运算符本质上应该是 $sum 运算符的表达式,如下所示:

this.aggregate([
    { "$match": { 
        "createdAt": { "$gte": start, "$lte": end }, 
        "status.verified": true 
    } },
    { 
        "$group": { 
            "_id": null,
            "balance": { "$sum": "$revenue" },
            "count": {
                "$sum": { 
                    "$cond": [
                        { "$eq": [ "$user", user ] }, 
                        1, 0
                    ]
                }
            }
        }
    }
], next);

关于node.js - 聚合结果,仅当条件为真时求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39397082/

相关文章:

node.js - Req.session undefined with express 4 and Redis store, express-session

node.js - OpenShift 上的 MongoDB 命令被拒绝

javascript - 无法使用 Passport 登录 - Nodejs

typescript - Typescript 中 Mongoose 模式的函数参数类型?

javascript - 如何使用异步等待包装回调?

node.js - ExpressJS | app.get() 放置在 app.use() 定义下方时似乎不起作用

javascript - 如何仅在 mongoDB 和 meteor 中获取不同的值?

angularjs - 如何使用 Angular 收集多个表单提交并一次提交到 mongoose 模型?

javascript - findOne 检索到的对象实例没有任何方法

Azure Cosmos DB 上的 MongoDB $sortbycount 解决方法