【问题标题】:Does Mongodb have a special value that's ignored in queries?Mongodb 是否有在查询中被忽略的特殊值?
【发布时间】:2012-08-22 02:23:45
【问题描述】:

我的 Web 应用程序使用 python 和 pyMongo 在 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 忽略的东西。有没有办法做到这一点?或者至少比我目前拥有的更简洁?

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    在 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}。
    • 好的,在某些情况下这是一个合理的解决方案,但我喜欢定义的参数如何为程序员提供抽象。我想我会使用第一个解决方案并发表评论说“保留在第一行”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2018-04-18
    • 1970-01-01
    • 2018-04-16
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多