如何解决如何通过将数据作为参数传递来过滤unix时间戳来查询具有聚集的mongodb
我正在通过连接到Mongodb服务器的元数据库进行查询。我要查询的字段是嵌套的,并且是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版本,建议您将数据库字段转换为日期类型,或者以某种方式将输入转换为数字时间戳(我不熟悉配置数据库)。 / p>
最后一个选项是使用$subtract,因为您可以从Mongo中的日期减去一个数字,然后检查该日期是在1970-01-01T00:00:00Z
之前还是之后。这种方法的问题在于它没有考虑时区,因此,如果您输入的时区与数据库中的时区不同或是动态的,那么您就必须解决这个问题。
db.collection.aggregate([
{
$match: {
$expr: {
$and: [
{
$eq: [
"$client_id",{
$gt: [
{
"$subtract": [
{{end}},"$room_data.meta.createdat"
]
},ISODate("1970-01-01T00:00:00.000Z")
]
},{
$lt: [
{
"$subtract": [
{{start}},ISODate("1970-01-01T00:00:00.000Z")
]
}
]
}
}
}
])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。