'串在一起'基于一组条件的pymongo查询

时间:2012-01-03 15:40:42

标签: python mongodb pymongo

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

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

例如,假设我有一个查询必须被约束到以下条件:

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

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

  • userjohnsmith
  • date_publishedtoday
  • 之后

摘要:除了必须创建所有可能的条件组合之外,还有一种方法可以将条件串在一起以形成pymongo中的查询吗?

1 个答案:

答案 0 :(得分:4)

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)

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