Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb是否有一个特殊值';在查询中忽略了什么?_Mongodb_Pymongo - Fatal编程技术网

Mongodb是否有一个特殊值';在查询中忽略了什么?

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

我的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'] = 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}
。好的,在某些情况下这是一个合理的解决方案,但我喜欢定义的参数如何为程序员提供抽象。我想我会使用第一个解决方案,并发表评论说“保持这在第一行”