聚合结果,仅在条件为真时求和

时间:2016-09-08 17:36:12

标签: 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 ] }

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

如果我无条件地计算数量(例如像这样)

,它的工作正常
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 }
});

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

1 个答案:

答案 0 :(得分:0)

$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);