如何通过将数据作为参数传递来过滤 unix 时间戳来使用聚合查询 mongodb
How do I query mongodb with aggregration by passing data as a parameter to filter unix time stamp
我正在通过连接到 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
是我以日期格式传递的参数(配置数据库功能)。我需要一些帮助将这些日期转换为 unix 时间戳,然后可以使用它来过滤特定日期之间的结果
如果您使用的是 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}}
]
}
]
}
}
}
])
如果您使用的是旧 Mongo 版本,我建议您将数据库字段转换为日期类型,或者以某种方式将输入转换为数字时间戳(我是不熟悉配置数据库)。
最后一个选项是使用 $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")
]
}
]
}
}
}
])
我正在通过连接到 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
是我以日期格式传递的参数(配置数据库功能)。我需要一些帮助将这些日期转换为 unix 时间戳,然后可以使用它来过滤特定日期之间的结果
如果您使用的是 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}}
]
}
]
}
}
}
])
如果您使用的是旧 Mongo 版本,我建议您将数据库字段转换为日期类型,或者以某种方式将输入转换为数字时间戳(我是不熟悉配置数据库)。
最后一个选项是使用 $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")
]
}
]
}
}
}
])