【问题标题】:How to automatically reload a MongoDB document in pymongo or mongoengine when accessing its attributes?访问其属性时如何在 pymongo 或 mongoengine 中自动重新加载 MongoDB 文档?
【发布时间】:2018-02-12 10:09:08
【问题描述】:

我使用 MongoDB 进行应用程序设置,在我的 Python 代码中,我使用 mongoengine 从 db 读取设置文档,mongoengine 是 pymongo 的高级包装器。 每次访问它的属性时,我都可以重新加载文档(假设 MongoDB 的 Setting 集合中有一个文档):

import time
import mongoengine

class Setting(mongoengine.Document):
    log_level = mongoengine.StringField(default='info')

setting = Setting.objects[0]
while True:
    time.sleep(1)
    setting.reload()
    print(setting.log_level)

但是,我对每次访问 log_level 属性时自动重新加载设置文档的方法感兴趣。在 mongoengine 中是否有一种干净的方法可以做到这一点?我更喜欢这样的代码,并且我的设置总是与 db 同步:

...
while True:
    time.sleep(1)
    print(setting.log_level)

我已经阅读了更多的 mongoengine 文档以找到一种不错的方法,并且我发现了 no_cache() 方法,该方法可用于强制 Setting 类返回非缓存查询集。有了这个,我离得更近了一点:

def get_setting():
    return Setting.objects.no_cache()[0] 

while True:
    time.sleep(1)
    print(get_setting().log_level)

有什么想法吗?

谢谢

【问题讨论】:

    标签: python mongodb pymongo mongoengine


    【解决方案1】:

    您可以编写一个自定义方法来执行此操作。 伪代码:

    def get_reloaded_attr(obj,attr):
        obj.reload()
        return getattr(obj,attr)
    

    【讨论】:

    • 感谢您的建议。但我正试图找到一种更简洁的方法,因为我必须在代码中的任何地方都使用这个设置文档,并且调用诸如 get_reloaded_attr(setting, 'log_level') 之类的函数是冗长而间接的。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2022-01-07
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多