J-bob
J-bob

Reputation: 9106

Does Mongodb have a special value that's ignored in queries?

My web application runs on MongoDB, using python and pyMongo. I get this scenario a lot - code that reads something like:

from pymongo import Connnection
users = Connection().db.users

def findUsers(firstName=None, lastName=None, age=None):
    criteria = {}
    if firstName:
        criteria['firstName'] = firstName
    if lastName:
        criteria['lastName'] = lastName
    if age:
        criteria['age'] = age
    query = users.find(criteria)
    return query

I find that kind of messy how I need an if statement for every value that's optional to figure out if it's needs to go into the search criteria. If only there were a special query value that mongo ignored in queries. Then my code could look like this:

def findUsers(firstName=<ignored by mongo>, lastName=<ignored by mongo>, age=<ignored by mongo>):
    query = users.find({'firstName':firstName, 'lastName':lastName, 'age':age})
    return query

Now isn't that so much cleaner than before, especially if you have many more optional parameters. Any parameters that aren't specified default to something mongo just ignores. Is there any way to do this? Or at-least something more concise than what I currently have?

Upvotes: 2

Views: 194

Answers (1)

Thomas
Thomas

Reputation: 2638

You're probably better off filtering your empty values in Python. You don't need a separate if-statement for each of your values. The local variables can be accessed by locals(), so you can create a dictionary by filtering out all keys with None value.

def findUsers(firstName=None, lastName=None, age=None):
    loc = locals()
    criteria = {k:loc[k] for k in loc if loc[k] != None}
    query = users.find(criteria)

Note that this syntax uses dictionary comprehensions, introduced in Python 2.7. If you're running an earlier version of Python, you need to replace that one line with

criteria = dict((k, loc[k]) for k in loc if loc[k] != None)

Upvotes: 3

Related Questions