我在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
管道之后才能工作!我错过了什么吗?等待你的回答,谢谢。
答案 0 :(得分:1)
是的,你不能在聚合管道之外使用$减法。聚合投影运算符对于聚合框架是唯一的。
目前,使用字段&#39; $ match表达式中的值很棘手;在MongoDB 3.6中,新的$ expr运算符将有所帮助。同时试试这个:
now = 1225
r = db.test.aggregate([
{
'$project': {
'comparison': {'$cmp': [
now,
[{'$sum': ['$update_interval', '$last_updated']}]]},
'last_updated': True,
'update_interval': True
}
}, {
'$match': {
'comparison': -1
}
}
])
for item in r:
print(item)
在你的for循环中你必须打印&#34; item&#34;而不是&#34; r&#34;。