根据一组条件“串接”pymongo 查询

joh*_*eth 1 python mongodb pymongo

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

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

例如,假设我有一个查询,该查询必须受限于以下条件:

  • tag包含任何this, is, a,tag
  • userjohnsmith
  • date_published是在之前today

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

  • userjohnsmith
  • date_published是在之后today

摘要:在 pymongo 中,是否有一种方法可以将条件串在一起形成查询,而不必创建所有可能的条件组合?

dcr*_*sta 5

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)
Run Code Online (Sandbox Code Playgroud)

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