动态填充Mongoosejs中的聚合函数

时间:2016-01-18 12:15:51

标签: node.js mongodb mongoose

我有一个NodeJS / Express应用程序,它将角色存储在MongoDB中。我想计算数据库中的特定字段,以便我可以在仪表板上报告。

例如,有些用户填写了他们的名字,其他用户填写了邮政编码。我想报告填写了名字的用户百分比。

为此我设置了一个控制器,它可以调用Persona模型。现在我想在特定字段上动态聚合。

我现在解决的方法是使用switch语句填充匹配变量:

countField: function countField(field, cb) {
switch(field) {
  case 'personal_firstname':
    var match = {$match: {
        "personal_firstname":  { $exists: true }
    }};
    break;
    break;
  case 'address_postalcode':
    var match = {$match: {
        "address_postalcode":  { $exists: true }
    }};
    break;
    break;
  default:
    var match = {$match: {
        "personal_firstname":  { $exists: true }
    }}; 
}

return this.aggregate([
    match,
    {$group: {
        _id: null, 
        totalfields: {$sum: 1}
    }}
], cb)

}

但是,如果我可以动态插入"字段"那会更好。我的聚合函数中的参数。但是,mongooseJS不允许我这样做。

有没有办法动态插入mongooseJS聚合函数?

1 个答案:

答案 0 :(得分:2)

您可以使用bracket notation动态构建匹配对象,如下所示:

countField: function countField(field, cb) {    
    var match = { "$match": {} };
    if (!field) field = "personal_firstname";
    match["$match"][field] = { $exists: true }

    return this.aggregate([ match,
        {
            "$group": {
                "_id": null, 
                "totalfields": { "$sum": 1 }
            }
        }
    ], cb)
}