【发布时间】:2012-12-13 20:01:24
【问题描述】:
是否可以计算文档服务器端中两个日期之间的差异,并对其进行查询? (就像 SQL 的 DATEDIFF 函数)
假设我有很多这样的文件:
>>> db.collection.find()
[
{ "id" : ObjectId("1"),
"starttime" : ISODate("2011-12-01T05:01:00"), # 5:01 AM
"endtime" : ISODate("2011-12-01T05:02:00") # 5:02 AM
},
{ "id" : ObjectId("2"),
"starttime" : ISODate("2011-12-01T06:01:00"), # 6:01:00 AM
"endtime" : ISODate("2011-12-01T06:01:30") # 6:01:30 AM
}
]
有没有办法实现类似的东西?
只返回时差:
>>> db.collection.date_difference_seconds(endtime, starttime)
[60, 30]
或查询:
>>> db.collection.find("timediff(endtime-starttime) < 40 seconds")
[
{ "id" : ObjectId("2"), ...} # Just second document (30s diff)
]
我已经阅读了有关 server-side JS 和 eval() 的信息,但文档说不推荐这些 - 它们是最佳选择吗?
(我显然可以将时间差以秒为单位添加为附加字段 ("time_diff": 30),或者在 Python 客户端计算差异,但我想知道它是否可能在服务器端)
客户端计算:
>>> for doc in (collection.find(None, {'starttime': 1, 'endtime': 1 }))
doc['endtime']-doc['startime']
0:01:00.000000
0:00:30.000000
【问题讨论】:
-
我想这样做你必须知道你想查询的时差?那么为什么不直接按不同的日期查询并计算客户端的差异呢?
-
@Sammaye 我不确定我是否跟随。我只对日期之间的差异感兴趣,而不是日期本身。你的意思是像我在问题中添加的 sn-p 吗?
-
我不认为有一种特殊的方法可以在服务器端完成,但可以在一个语句客户端完成。例如:map(lambda x: (x['endtime'] - x['starttime']).total_seconds(), db.collection.find())
-
好吧,其实我明白你想做什么:
db.collection.find("timediff(endtime-starttime) < 40 seconds")我认为它更简单,但我没有考虑足够。嗯,有可能在这里使用$where添加时间计算功能,这将避免 eval 但它会严重降低速度。我认为,如果您要使用聚合函数使用 docs.mongodb.org/manual/reference/aggregation/#date-operators 创建一个新的计算字段 -
MongoDB 没有等价物。因此,如果它是一个频繁查询,只需按照您的建议预先计算它并存储在一个附加字段中。您可以通过这种方式添加索引和排序等(如果需要)。或者可能是 MapReduce 函数,但该字段会更简单。
标签: python mongodb datetime pymongo timedelta