我正在编写一个应用程序,其中有一些气象传感器每5分钟向服务器发送一次温度和湿度。
我想画出温度和湿度如何变化的图表,即一夜之间。我的想法是根据过去24小时的数据绘制图表。
我自己无法弄清楚,所以我想也许我可以在这里寻求帮助。当然,每个测量文档都有一个名为createdAt
的字段,其中包含创建时刻的时间戳。
我需要构建一个mongoose查询,该查询将检索过去24小时内收集的测量值,但每小时只进行一次测量。使用设备测量的5分钟时间间隔,我将每小时创建12个文档。我想每小时只检索其中一个。
到目前为止,我能够提出这个问题(使用gt
来测量最近24小时,不知道如何每小时只获得一个文档):
Measurements.find({ "createdAt": { $gt: new Date(Date.now() - 24*60*60 * 1000) } })
答案 0 :(得分:1)
使用聚合
this is a great article了解如何对文档进行分组,然后为每个文档选择一个项目。
您还需要过去24小时过滤文档,然后从时间戳投影查找和hour
。
如果您需要,比方说,过去48小时,您需要按小时和天进行分组。
您的查询将是这样的
collection.aggregate([
{
"$filter": {
"createdAt": { $gt: new Date(Date.now() - 24*60*60 * 1000) }
}
},
{
"$project": {
"h": {"$hour" : "$createdAt"},
"original_doc": "$$ROOT"
}
},
{
"$group": {
"_id": { "hour": "$h" },
"docs": { $push: "$original_doc" }
}
},
{
$replaceRoot: {
newRoot: { $arrayElemAt: ["$docs", 0] }
}
}
])
答案 1 :(得分:1)
您可以使用以下聚合来获取每小时的第一个和最后一个文档。
"0x70a08231" + "000000000000000000000000" + address
按小时订购文件,然后按小时$sort
订购文件,每小时输出第一个和最后一个文件。
$group
是系统变量,用于访问整个文档。
$$ROOT
答案 2 :(得分:0)
它对我有用:
var pipeline = [
{
$match: {
$and: [
{createdAt: {$gte: startDate}},
{createdAt: {$lte: endDate}},
{eventType: 'update'}
]
}
},
{$sort: {createdAt: -1}},
{
$group: {
_id: "$person",
persons: {$push: "$$ROOT"}
}
},
{
$replaceRoot: {
newRoot: {$arrayElemAt: ["$persons", 0]}
}
},
{
$lookup: {
from: 'people',
localField: 'person',
foreignField: '_id',
as: 'person'
}
},
{$unwind: "$person"}
];
VisitEvent.aggregate(pipeline)
.then(function (events) {ere