【发布时间】:2016-08-29 19:57:09
【问题描述】:
我们的项目数据库有一个名为 values 的上限集合,每隔几分钟就会使用来自传感器的新数据进行更新。这些传感器都属于单个传感器节点,我想在单个聚合中查询这些节点的最后数据。我遇到的问题是只过滤掉所有类型的传感器中的最后一种,同时仍然只有一个(有效的)查询。我环顾四周,找到了 $group 参数,但我似乎无法弄清楚在这种情况下如何正确使用它。
数据库结构如下:
节点:
{
"_id": 681
"sensors": [
{
"type": "foo"
},
{
"type": "bar"
}
]
}
价值观:
{
"_id" : ObjectId("570cc8b6ac55850d5740784e"),
"timestamp" : ISODate("2016-04-12T12:06:46.344Z"),
"type" : "foo",
"nodeid" : 681,
"value" : 10
}
{
"_id" : ObjectId("190ac8b6ac55850d5740776e"),
"timestamp" : ISODate("2016-04-12T12:06:46.344Z"),
"type" : "bar",
"nodeid" : 681,
"value" : 20
}
{
"_id" : ObjectId("167bc997bb66750d5740665e"),
"timestamp" : ISODate("2016-04-12T12:06:46.344Z"),
"type" : "bar",
"nodeid" : 200,
"value" : 20
}
{
"_id" : ObjectId("110cc9c6ac55850d5740784e"),
"timestamp" : ISODate("2016-04-09T12:06:46.344Z"),
"type" : "foo",
"nodeid" : 681,
"value" : 12
}
假设我想要来自节点 681 的数据,我想要这样的结构:
节点:
{
"_id": 681
"sensors": [
{
"_id" : ObjectId("570cc8b6ac55850d5740784e"),
"timestamp" : ISODate("2016-04-12T12:06:46.344Z"),
"type" : "foo",
"nodeid" : 681,
"value" : 10
},
{
"_id" : ObjectId("190ac8b6ac55850d5740776e"),
"timestamp" : ISODate("2016-04-12T12:06:46.344Z"),
"type" : "bar",
"nodeid" : 681,
"value" : 20
}
]
}
请注意如何不查询 foo 的一个值,因为如果有多个值,我只想获取可能的最新值(这种情况总是如此)。集合的排序已经根据时间戳,因为集合是有上限的。
我有这个查询,但它只是从数据库中获取所有值(这在一生中要做的事情太多了,更不用说网络应用程序的一个请求了),所以我想知道如何过滤它 在聚合之前。
查询:
db.nodes.aggregate(
[
{
$unwind: "$sensors"
},
{
$match:{
nodeid: 681
}
},
{
$lookup:{
from: "values", localField: "sensors.type", foreignField: "type", as: "sensors"
}
}
}
]
)
【问题讨论】:
标签: mongodb aggregation-framework