繁体   English   中英

Pymongo-奇怪的聚集行为

[英]Pymongo - Weird aggregation behavior

在这里,我在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表达式)。

首先,我尝试使用pymongo在Python中执行以下操作:

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管道之后起作用! 我想念什么吗? 等待您的答案,谢谢。

正确,您不能在聚合管道之外使用$ subtract。 聚合投影运算符对于聚合框架是唯一的。

目前,在$ 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循环中,您必须打印“ item”,而不是“ r”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM