【问题标题】:How to compare dates from MongoDB object in python?如何比较python中MongoDB对象的日期?
【发布时间】:2022-01-18 01:11:43
【问题描述】:

我正在尝试计算 MongoDB 对象和今天日期之间的年份差异。 MongoDB 对象如下所示:

Key: Value

club_joined: 2021-08-10T00:00:00.000+00:00

我有 python 代码(有效):

loyal_players = []

for player in players.find():
    # get time players have been at club
    current_date = datetime.today()
    joined_club = player['club_joined']

    time_at_club = relativedelta(current_date, joined_club)
    time_at_club_years = time_at_club.years

    # check if they are over 10 years
    if time_at_club_years >= 10:
        loyal_players.append(player['short_name'])

但我想要的是一个可以添加到 .find() 行的 Mongo 查询:

for player in players.find():

我知道它背后的逻辑是:

for player in players.find(
    where (
        (todayDate - player['club_joined']) > 10
    ):

但是如何在 python 中将其编写为 MongoDB 查询?


MongoDb 类型:

【问题讨论】:

  • 双重检查:club_joined 是 ISO8601 字符串吗?不是真正的 mongodb 日期时间?
  • @BuzzMoschetti 不,它是Date,我将在我的问题中添加屏幕截图以显示
  • @RC07JNR 您能否仅转换为时间戳毫秒并获取差异,然后计算天/月/年?或者这对您的应用来说是否过于消耗(在查询数据之后)
  • @Jacob 如果可以将其添加到 MongoDD 行的 .find() 中,这可能会起作用,但我不知道该怎么做!

标签: python mongodb


【解决方案1】:

$subtract 函数将采用 2 个日期并以毫秒为单位返回差异,因此可以正常工作:

    from pymongo import MongoClient
    import datetime

    now = datetime.datetime.now()

    TARG = 86400 * 1000 * 365 * 10 # secs in day X millis X 365 days X 10 yrs                            

    cursor = db.foo.aggregate([
        {"$match": {"$expr": {"$gt": [ {"$subtract": [now,"$club_joined"]}, TARG ] } }}
    ])
    for doc in cursor:
        print(doc)

【讨论】:

  • 我认为这是正确的!这给了我以下错误:类'datetime'的未解析属性引用'datetime'。我的 import = from datetime import datetime 这条线正是你所拥有的,有什么想法吗?
  • 我将 2 个导入添加到我的答案中,因为它们出现在我的工作示例中。不要害羞地接受答案并投票。 ;-)
  • 太棒了!非常感谢
【解决方案2】:

使用relativedelta 似乎更简单:

import datetime
from dateutil.relativedelta import relativedelta

dt = datetime.datetime.now() - relativedelta(years=10)

cursor = db.foo.find({'club_joined': {'$lt': dt}})

for doc in cursor:
    print(doc)

【讨论】:

  • 确实如此。我一直在尝试演示 agg 函数。
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多