johneth
johneth

Reputation: 2938

'Stringing together' a pymongo query based on a set of conditions

I have a set of conditions that I need to use to retrieve some data from a mongodb database (using pymongo). Some of these conditions are optional, and others may have more than one possible value.

I'm wondering if there is a way of 'dynamically' constructing a pymongo query based on these conditions (instead of creating individual queries for each possible combination of conditions).

For example, assume that I have one query which has to be constrained to the following conditions:

...whereas another query may only be constrained to the following:

Summary: Instead of having to create every possible combination of conditions, is there a way of stringing conditions together to form a query in pymongo?

Upvotes: 1

Views: 1273

Answers (1)

dcrosta
dcrosta

Reputation: 26278

A PyMongo query is just a Python dictionary, so you can use all the usual techniques to build one on the fly:

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)

The actual logic you implement is obviously dependent on what you want to vary your find calls by, these are just a few examples. You will also want to validate the input if it is coming from an untrusted source (e.g. a web application form, URL parameters, etc).

Upvotes: 5

Related Questions