我有一个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聚合函数?
答案 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)
}