是否可以计算文档服务器端中两个日期之间的差异,并对其进行查询? (与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客户端的差异,但我想知道它是否可能是服务器端的<) / p>
客户端计算:
>>> for doc in (collection.find(None, {'starttime': 1, 'endtime': 1 }))
doc['endtime']-doc['startime']
0:01:00.000000
0:00:30.000000
答案 0 :(得分:3)
正如Sammaye所说,我认为唯一的方法是使用aggregate()函数。例如,做类似的事情:
db.collection.aggregate([{$project: {timediff: {$subtract: ['$endtime' , '$starttime']}}}])
您实际上是在定义一个新的运行时字段“timediff”,它是根据现有数据计算出来的。然后,您应该能够向管道添加$match
步骤以过滤差异:
db.collection.aggregate([{$project: {timediff: {$subtract: ['$endtime' , '$starttime']}}}, {$match: {timediff: {$lte: 40}}}])
我没有尝试过这个具体的例子,所以可能会有一些缺少大括号或括号......但希望你能得到这个想法。就您可以定义的数据管道而言,聚合框架非常强大。
祝你好运!