【发布时间】:2017-10-09 23:08:30
【问题描述】:
这里我在test.test 集合中有两个文档:
> db.test.find()
{ "_id" : ObjectId("AAA"), "last_updated" : 1000, "update_interval" : 50 }
{ "_id" : ObjectId("BBB"), "last_updated" : 1200, "update_interval" : 50 }
我想找到应该更新的文档(通过测试last_updated <= now - update_interval 表达式)。
首先,我尝试在 Python 中使用 pymongo 进行以下操作:
from pymongo import MongoClient
db = MongoClient().test
now = 1225
r = db.test.find({
'last_updated': {'$lte': {'$subtract': [now, '$update_interval']}}
})
for item in r:
print(r)
但是,它不打印任何内容。但是当我将{'$subtract': [now, '$update_interval']} 更改为硬编码值1175 时,它可以正常工作。
我认为我不能在聚合管道之外使用$subtract,所以我尝试了另一个:
r = db.test.aggregate([
{
'$match': {
'last_updated': {'$lte': {'$subtract': [now, '$update_interval']}},
},
},
])
嗯,它看起来和上一个一样,是的,它也不起作用。
最后,我做了最后一次尝试:
r = db.test.aggregate([
{
'$project': {
'when_to_update': {'$subtract': [now, '$update_interval']},
'last_updated': True,
'update_interval': True,
},
},
{
'$match': {
'last_updated': {'$lte': '$when_to_update'},
},
},
])
好的,它不再起作用了。但奇怪的是,当我只通过$project 管道时,结果看起来像:
{'_id': ObjectId('AAA'), 'last_updated': 1000.0, 'update_interval': 50.0, 'when_to_update': 1175.0}
{'_id': ObjectId('BBB'), 'last_updated': 1200.0, 'update_interval': 50.0, 'when_to_update': 1175.0}
所以它也应该在通过$match 管道后工作!我错过了什么吗?等待您的答复,谢谢。
【问题讨论】:
-
您无法在匹配阶段比较字段。从 3.6 版本开始可以。简单的解决方法是更改
'can_update': {'$lte': ['$last_updated', {'$subtract': [now, '$update_interval']}]}和{ '$match': { 'can_update': true, }, }
标签: python mongodb aggregation-framework pymongo