【问题标题】:'Stringing together' a pymongo query based on a set of conditions“串在一起”基于一组条件的 pymongo 查询
【发布时间】:2012-01-03 23:54:43
【问题描述】:

我需要使用一组条件从 mongodb 数据库中检索一些数据(使用 pymongo)。其中一些条件是可选的,而其他条件可能有多个可能的值。

我想知道是否有一种基于这些条件“动态”构建 pymongo 查询的方法(而不是为每个可能的条件组合创建单独的查询)。

例如,假设我有一个查询必须限制在以下条件:

  • tag 包含 thisisatag 中的任何一个
  • userjohnsmith
  • date_publishedtoday 之前

...而另一个查询可能仅限于以下内容:

  • userjohnsmith
  • date_publishedtoday 之后

总结:不必创建所有可能的条件组合,有没有办法将条件串在一起以在 pymongo 中形成查询?

【问题讨论】:

    标签: python mongodb pymongo


    【解决方案1】:

    PyMongo 查询只是一个 Python 字典,因此您可以使用所有常用技术即时构建一个:

    def find_things(tags=None, user=None, published_since=None):
        # all queries begin with something common, which may
        # be an empty dict, but here's an example
        query = {
            'is_published': True
        }
        if tags:
            # assume that it is an array of strings
            query['tags'] = {'$in': tags}
        if user:
            # assume that it is a string
            query['user'] = user
        if published_since:
            # assume that it is a datetime.datetime
            query['date_published'] = {'$gte': published_since}
        # etc...
    
        return db.collection.find(query)
    

    您实现的实际逻辑显然取决于您想要改变 find 调用的内容,这些只是几个示例。如果输入来自不受信任的来源(例如 Web 应用程序表单、URL 参数等),您还需要验证输入。

    【讨论】:

    • 啊,谢谢你的解释。我不确定这种方法是否可行,所以感谢您为我解决这个问题!
    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 2021-08-05
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多