我有一个用例,其中将在数组中获取动态字段名称。我需要将这些字段传递给mongo db聚合查询,以获取给定月份中该字段值的总和。我需要删除timeStamp & deviceId
数组中的字段。
let jsonObj = [
{ name: "heat", value: "HEAT" },
{ name: "humidity", value: "HUMIDITY" },
{ name: "deviceId", value: "DEVICEID" },
{ name: "timeStamp", value: "TIMESTAMP" }
];
let vList = [];
jsonObj.forEach(async data => {
if (!data.name.match(/time/g) || !data.name.match(/deviceId/g)) {
vList.push(data.name); //Should exclude timestamp & deviceId (case-insensitive)
}
});
let variableObj = [];
vList.forEach(async data => {
let k = "{" + '"$sum":"$' + data + '"}';
// console.log(k)
k = JSON.parse(k);
variableObj.push(data + ":" + k);
});
然后,结果数组如下所示。
[ 'heat:{"$sum":"$heat"}',
'humidity:{"$sum":"$humidity"}',
'timeStamp:{"$sum":"$timeStamp"}',
'deviceId:{"$sum":"$deviceId"}' ]
我没有得到如何删除每个项目周围的单引号以及如何将它们传递给查询。
我的查询是:
db.collection(templateId).aggregate([
{
$match: {
entryDayTime: {
$lt: new Date(lastDay),
$gte: new Date(firstDay)
}
}
},
{
$group: {
_id: "$deviceId",
Count: { $sum: 1 }
// Should pass those array elements here like,
//heat:{"$sum":"$heat"},
//humidity:{"$sum":"$humidity"}
}
},
{ $sort: { entryDayTime: -1 } }
]);
您可以一起创建整个组对象,然后将其传递到$group
舞台上。同时删除那些async
关键字,迭代不是异步的。
注意: if子句必须&&
同时排除两个关键字,并且i
flag是为了使正则表达式不区分大小写。目标对象的创建可以在第一次迭代中完成。
let jsonObj = [
{ name: "heat", value: "HEAT" },
{ name: "humidity", value: "HUMIDITY" },
{ name: "deviceId", value: "DEVICEID" },
{ name: "timeStamp", value: "TIMESTAMP" }
];
let groupObject = {
_id: "$deviceId",
Count: { $sum: 1 }
};
jsonObj.forEach(data => {
if (!data.name.match(/timestamp/gi) && !data.name.match(/deviceid/gi)) {
groupObject[data.name] = { $sum: "$" + data.name };
}
});
console.log(groupObject);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句