gpt4 book ai didi

python - 按最接近字段的日期对 Mongodb 查询中的文档进行排序

转载 作者:行者123 更新时间:2023-11-30 23:21:52 25 4
gpt4 key购买 nike

我在 mongodb 中收集了代表过去和即将发生的事件的文档。文档中有两个日期字段“start”和“end”,它们是 bson ISODATE 对象。我正在执行一个查找查询,获取 3 天前结束的所有事件。

db.events.find({'end': {'$gte': datetime.utcnow() - timedelta(days=3)})

如何根据今天和事件结束日期时间之间的时间(和日期)对此查询的响应进行排序。换句话说,2 天前结束的事件应该与 2 天后将发生的事件发生在大致相同的位置。这很重要,因为我不想首先显示所有已经发生的事件,也不想首先显示最远的将来发生的事件。

最佳答案

如果我理解正确的话,您希望按今天与事件结束日期之间的时间差进行排序。因此,如果您明天有一项事件,昨天有一项事件,前天有一项事件,您希望它们的顺序是:

  1. 明天的事件
  2. 昨天的事件
  3. 前天事件

据推测,1 和 2 可以互换,具体取决于实际时差。

这绝对可以通过 MongoDB 的聚合框架来完成。它的工作原理如下:

  1. 匹配在特定时间段内结束的文档。
  2. 在新字段中投影今天与每个事件的结束时间之间的差异(例如 timeDelta)。
  3. 由于 MongoDB 没有用于聚合框架的绝对运算符,因此请执行一些条件检查以获取时间增量的绝对值并将其投影到新字段,例如 absTimeDelta
  4. absTimeDelta 排序。

所以它应该看起来像这样:

db.events.aggregate([
{ '$match':
{ 'end':
{ '$gte': datetime.utcnow() - timedelta(days=3) }
}
},
{ '$project':
{
'timeDelta': {
'$subtract': ['$end', datetime.utcnow()]
}
}
},
{ '$project':
{
'absTimeDelta' : {
'$cond' : [
{ '$lte': ['$timeDelta', 0] },
{ '$multiply' : ['$timeDelta', -1 ] },
'$timeDelta'
]
}
}
},
{ '$sort':
{
'absTimeDelta' : 1
}
}
])

编辑:在 MongoDB 版本 3.2 中,this JIRA ticket已修复,引入 $abs operator 。这意味着可以删除第二个 $project 并更新第一个。您可以使用 $abs: { '$subtract': ['$end', datetime.utcnow()] 代替 '$subtract': ['$end', datetime.utcnow()] ()] }.

关于python - 按最接近字段的日期对 Mongodb 查询中的文档进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24762630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com