Mongoose查询过去24小时内的文档,每小时只有一个文档

时间:2018-01-13 20:48:38

标签: node.js mongodb mongoose

我正在编写一个应用程序,其中有一些气象传感器每5分钟向服务器发送一次温度和湿度。

我想画出温度和湿度如何变化的图表,即一夜之间。我的想法是根据过去24小时的数据绘制图表。

我自己无法弄清楚,所以我想也许我可以在这里寻求帮助。当然,每个测量文档都有一个名为createdAt的字段,其中包含创建时刻的时间戳。

我需要构建一个mongoose查询,该查询将检索过去24小时内收集的测量值,但每小时只进行一次测量。使用设备测量的5分钟时间间隔,我将每小时创建12个文档。我想每小时只检索其中一个。

到目前为止,我能够提出这个问题(使用gt来测量最近24小时,不知道如何每小时只获得一个文档):

Measurements.find({ "createdAt": { $gt: new Date(Date.now() - 24*60*60 * 1000) } })

3 个答案:

答案 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