【发布时间】:2020-01-08 21:56:17
【问题描述】:
我有一个用例,我有 3 个集合。即每个模板的模板、组和 1-动态集合,它们将在模板创建后立即创建。
每个template 由devices 组成,每个device 由一个groupId 组集合组成。动态集合存储模板设备推送的数据。
现在我需要找出 Groups 集合的设备grouped by groupName 的聚合(总和)值。
以下是我收藏的样本数据。
模板数据
{
"_id": "5e0ae38729218b0a3861118b",
"templateId": "27127206822",
"devices": [
{
"deviceId": "waterTest",
"_id": "5e0ae49629218b0a3861118f",
"group": "5e0ae41d29218b0a3861118d",
},{
"deviceId": "Test",
"_id": "5e0af166981f39410cd89b72",
"group": "5e0af11d981f39410cd89b70"
}]
}
动态收集数据
[
{
"_id": "5e0ae793b1384737a4f855cf",
"template": "27127206822",
"deviceId": "waterTest",
"heat" : 20,
"humidity" : 10
},{
"_id": "5e0ae7a2b1384737a4f855d0",
"template": "27127206822",
"deviceId": "waterTest",
"heat" : 40,
"humidity" : 20
},{
"_id": "5e0ae890b1384737a4f855d3",
"template": "27127206822",
"deviceId": "waterTest",
"heat" : 60,
"humidity" : 50
},{
"_id": "5e0af188981f39410cd89b73",
"template": "27127206822",
"deviceId": "Test",
"heat": 60,
"humidity": 50
},{
"_id": "5e0af196981f39410cd89b74",
"template": "27127206822",
"deviceId": "Test",
"heat": 10,
"humidity": 20
}]
组数据
[{
"_id": "5e0af11d981f39410cd89b70",
"template": "5e0ae38729218b0a3861118b",
"groupName": "Flats"
},{
"_id": "5e0ae41d29218b0a3861118d",
"template": "5e0ae38729218b0a3861118b",
"groupName": "SPool"
}]
现在看看我到目前为止写的聚合查询。
let templateId = "27127206822"; // Dynamic Collection
[err, templateData] = await to(mongoose.connection.db.collection(templateId)
.aggregate([
{
$lookup:{
from:"templates",
localField:"template",
foreignField:"templateId",
as:"template"
}
},{
$unwind:"$template"
},{
$unwind:"$template.devices"
},{
$lookup:{
from:"groups",
localField:"template.devices.group",
foreignField:"_id",
as:"group"
}
},{
$unwind:"$group"
},{
$group:{
_id: "$groupData.groupName",
heat:{$sum:"$heat"},
humidity:{$sum:"$humidity"},
count:{$sum:1}
}
}]));
现在,我需要得到每个 device 的总和,每个 device 由 Group 集合的 groupName 分组。但我得到了错误的数据。即,一个组的总和也被添加到所有其他组中。
**返回的输出**
//Am getting this Data
[
{
"_id": "Flats",
"heat": 190, // 2 group's data getting added in both the groups
"humidity": 150,
"count":5
},{
"_id": "SPool",
"heat": 190,
"humidity": 150,
"count":5
}]
预期输出
[
{
"_id": "Flats",
"heat": 70,
"humidity": 70,
"count":2
},{
"_id": "SPool",
"heat": 120,
"humidity": 80,
"count":3
}]
为了获得所需的结果,我有什么遗漏的吗?
【问题讨论】:
-
你为什么要转至
$lookup本地template和国外templateId?我看不出有任何方法可以匹配"13435158964"和动态集合中的任何值。
标签: javascript node.js mongodb mongoose