Mongodb是否有一个特殊值';在查询中忽略了什么?
我的web应用程序运行在MongoDB上,使用python和pyMongo。我得到了很多这样的场景-代码如下:Mongodb是否有一个特殊值';在查询中忽略了什么?,mongodb,pymongo,Mongodb,Pymongo,我的web应用程序运行在MongoDB上,使用python和pyMongo。我得到了很多这样的场景-代码如下: from pymongo import Connnection users = Connection().db.users def findUsers(firstName=None, lastName=None, age=None): criteria = {} if firstName: criteria['firstName'] = firstNa
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
def findUsers(firstName=,lastName=,age=):
query=users.find({'firstName':firstName,'lastName':lastName,'age':age})
返回查询
现在不是比以前更干净了吗,特别是如果你有更多的可选参数。任何未指定的参数都默认为mongo忽略的参数。有没有办法做到这一点?或者至少比我现在拥有的更简洁?您可能最好用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)
哦,太棒了。我不知道理解对词典有用,也不知道理解中可以有一个
if
语句。我唯一的问题是,您必须确保在任何局部声明之前调用locals()
,否则它可能会在更复杂的函数中返回不需要的变量。有没有只返回本地函数参数的方法?您可以使用位置参数列表:def findUsers(**args):…
,然后在函数中使用args
字典。如果使用findUsers(firstName='Tom',age=25)
调用函数,则args
字典将类似于{firstName':'Tom',age':25}
。好的,在某些情况下这是一个合理的解决方案,但我喜欢定义的参数如何为程序员提供抽象。我想我会使用第一个解决方案,并发表评论说“保持这在第一行”