MongoDB按datetime字段查询1h间隔

55ooxyrt  于 2023-05-06  发布在  Go
关注(0)|答案(2)|浏览(188)

我一直在尝试从一个集合中每1小时提取一条记录,该集合在datetime(日期)上每10秒有1条记录。文件是这样的:

datetime: 2021-11-26T15:08:20.000+00:00
owner_id: "INTERNAL"
motor_id: 24

datetime单据字段为Date()类型。

在这个集合中,我在datetime字段上每10秒有1条记录(几天),但我想每个1小时datetime间隔只提取一条记录。我怎么能把这个存档?
提前感谢任何提示,帮助或正确的文档方向。
我试着去理解这个:https://mongoing.com/docs/reference/operator/aggregation/filter.html没有成功。不知道如何增加时间。
编辑:关于收藏的更多信息:
collection 1有26.303条记录如下:

{
  "_id": {
    "$oid": "644b34a3756b9c1dc169e20d"
  },
  "datetime": {
    "$date": {
      "$numberLong": "1637939300000"
    }
  },
  "customer_id": "INTERNAL",
  "owner_id": "INTERNAL",
  "GMHP": -0.54,
  "AMHP": 198.19,
  "OMHP": 428.883544921875,
  "AROP": 148.57066345214844,
  "OROP": 102.5451889038086
}

每个文档都有一个10秒的时间间隔存储在datetime字段中。我计划在将来将这些文档更改为时间序列。我的目标是选择每个小时的文档,例如:
第1份文件日期时间:2021-11- 26 T15:08:20.000+00:00第二份文件日期时间:2021-11- 26 T15:09:20.000+00:00等...
我可以安全地忽略T15:08:30到T15:09:10之间的所有字段。

vc9ivgsu

vc9ivgsu1#

一个选项是简单地使用$dateToParts。如果每10秒有一个文档,$match步骤将返回每小时的第一个文档:

db.collection.aggregate([
  {$set: {
      datetimeParts: {
        $dateToParts: {
          date: "$datetime"
        }
      }
  }},
  {$match: {
      "datetimeParts.minute": 0,
      "datetimeParts.second": {$lt: 10}
  }},
  {$unset: "datetimeParts"}
])

了解它在playground example上的工作原理

yruzcnhs

yruzcnhs2#

经过一番努力,我试图让尼姆罗德serok发送的查询在Mongo和DocumentDB上都能工作。然后我意识到当使用PyMongo或vanilla MongoDB驱动程序时,DocumentDB的问题是多么有限。
DocumentDB不支持$set,因此我不得不将其替换为$addFields。之后我意识到dateToParts也不受支持,因为这个函数需要字符串格式,而我有一个Date()类型。
如果有人想在DocumentDB上实现类似的结果,这里有一个解决方案。可能有更好的解决方案,但它对我来说与Mongo查询相同的结果。
(Im使用PyMongo)
entry_date从集合中确定第一个datetime,这是可选的。您可以替换minutesecond变量以满足范围需求。
我希望它也能帮助DocumentDB用户。

entry_date = db.collection.find_one(filter=filtering, sort=[('datetime', 1)])
    entry_date = entry_date['datetime']
    minute = entry_date.minute
    second = entry_date.second
    report = db.collection.aggregate([
        {
            "$addFields": {
                "hour": {"$hour": "$datetime"},
                "minute": {"$minute": "$datetime"},
                "second": {"$second": "$datetime"},
                "year": {"$year": "$datetime"},
                "month": {"$month": "$datetime"},
                "day": {"$dayOfMonth": "$datetime"}
            }
        },
        {
            "$match": {
                "minute": minute,
                "second": second
            }
        },
        {
            "$project": {
                "_id": 0,
                "datetime": 1,
                "hour": 1,
                "minute": 1,
                "second": 1,
                "year": 1,
                "month": 1,
                "day": 1
            }
        }
    ])

相关问题