Does Mongodb have a special value that's ignored in queries?
Question: 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?


Answer: 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)
    

