2012-08-27 31 views
2

我的web應用程序使用python和pyMongo在MongoDB上運行。我得到這個場景很多 - 代碼讀取類似:Mongodb是否有一個在查詢中被忽略的特殊值?

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 

我覺得那種凌亂的我是多麼需要一個if聲明爲每一個是可選的,以弄清楚它是否需要進入搜索標準值。如果只有在查詢中有mongo忽略的特殊查詢值。然後我的代碼看起來是這樣的:

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 

現在是不是比以前更清潔說了這麼多,特別是如果你有更多的可選參數。任何未指定的參數默認爲mongo只是忽略。有沒有辦法做到這一點?或者至少比我現在有更簡潔的東西?

回答

3

您可能更適合在Python中過濾空值。對於每個值,您都不需要單獨的if語句。局部變量可以通過locals()訪問,因此您可以通過過濾掉所有具有None值的鍵來創建字典。

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) 

請注意,此語法使用Python 2.7中引入的字典解析。如果您運行的是早期版本的Python,則需要用一條線代替該線

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

哦,那太棒了。我不知道理解是否適用於字典,或者你可以在理解中使用if語句。我唯一的問題是,你必須確保在任何本地聲明之前調用locals(),否則它可能會在更復雜的函數中返回不需要的變量。有沒有一種方法只返回本地函數參數? –

+0

你可以做的是使用一個位置參數列表:'def findUsers(** args):...',然後在函數內部使用'args'字典。如果你用'findUsers(firstName ='Tom',age = 25)'調用該函數,'args'字典將看起來像'{'firstName':'Tom','age':25}'。 – Thomas

+0

好的,在某些情況下這是一個合理的解決方案,但我喜歡定義的參數如何爲程序員提供抽象。我想我會使用第一個解決方案,並發表評論說:「保持在第一線」 –