如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb
Posted
技术标签:
【中文标题】如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb【英文标题】:How do I query mongodb with aggregration by passing data as a parameter to filter unix time stamp 【发布时间】:2020-08-20 13:46:25 【问题描述】:我正在通过连接到 Mongodb 服务器的 Metabase 进行查询。我正在查询的字段是嵌套的并且是 Unix 时间戳。见下文
room_data:
"meta":
"xxx_unrecognized": null,
"xxx_sizecache": 0,
"id": "Hke7owir4oejq3bMf",
"createdat": 1565336450838,
"updatedat": 1565336651548,
我写的查询如下
[
$match:
client_id: "client_id",
"room_data.meta.createdat":
$gt: "start",
$lt: "end",
,
$group:
id: "$room_data.recipe.id",
count:
$sum: 1
]
我没有得到任何结果,因为字段 room_data.meta.createdat
不是我传入的日期(2020 年 8 月 20 日)。这里 start
和 end
是我的参数(元数据库功能) m 传入日期格式。我需要一些帮助来将这些日期转换为 unix 时间戳,然后可以使用它来过滤掉特定日期之间的结果
【问题讨论】:
【参考方案1】:如果您使用的是 Mongo 4.0+ 版,则可以在聚合中使用 $toDate,如下所示:
db.collection.aggregate([
$match:
$expr:
$and: [
$eq: [
"$client_id",
client_id
]
,
$lt: [
$toDate: "$room_data.meta.createdat"
,
end
]
,
$gt: [
$toDate: "$room_data.meta.createdat"
,
start
]
]
])
MongoPlayground
如果您使用的是较旧的 Mongo 版本,我建议您将数据库字段转换为 Date 类型,或者以某种方式将输入转换为数字时间戳(我不熟悉元数据库)。
最后一个选项是使用$subtract,因为您可以从Mongo 中的日期中减去一个数字,然后检查该日期是在1970-01-01T00:00:00Z
之前还是之后。这种方法的问题是它不考虑时区,所以如果您输入的时区与您的数据库不同或者是动态的,这将是您必须考虑的问题。
db.collection.aggregate([
$match:
$expr:
$and: [
$eq: [
"$client_id",
client_id
]
,
$gt: [
"$subtract": [
end,
"$room_data.meta.createdat"
]
,
ISODate("1970-01-01T00:00:00.000Z")
]
,
$lt: [
"$subtract": [
start,
"$room_data.meta.createdat"
]
,
ISODate("1970-01-01T00:00:00.000Z")
]
]
])
MongoPlayground
【讨论】:
以上是关于如何通过将数据作为参数传递以过滤 unix 时间戳来查询具有聚合的 mongodb的主要内容,如果未能解决你的问题,请参考以下文章