基于条件串联 pymongo 查询

1 投票
1 回答
1263 浏览
提问于 2025-04-17 09:27

我有一组条件,需要用来从mongodb数据库中获取一些数据(使用pymongo)。其中一些条件是可选的,还有一些条件可能有多个值。

我在想有没有办法根据这些条件“动态”构建一个pymongo查询,而不是为每种可能的条件组合都创建一个单独的查询。

举个例子,假设我有一个查询需要满足以下条件:

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

...而另一个查询可能只需要满足以下条件:

  • userjohnsmith
  • date_publishedtoday 之后

总结:有没有办法把条件串联起来,形成一个pymongo查询,而不需要创建每一种可能的条件组合?

1 个回答

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)

你具体实现的逻辑当然取决于你想要根据什么来变化你的查找调用,这里只是一些例子。如果输入来自不可信的来源(比如网页表单、网址参数等),你还需要对输入进行验证。

撰写回答