1

是否可以计算文档服务器端中两个日期之间的差异并对其进行查询?(就像 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)
]

我已经阅读了有关服务器端 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
4

1 回答 1

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}}}])

我还没有尝试过这个具体的例子,所以可能会有一些丢失的大括号或括号......但希望你明白这一点。就您可以定义的数据管道而言,聚合框架非常强大。

祝你好运!

于 2012-12-28T21:13:47.303 回答