mongo中所有记录的较低字段

时间:2018-01-16 22:54:56

标签: python mongodb

基本上我的帐户设置如下:

{
 'email': 'Matt@GMAIL.com',
 'others': '...'
}

在sql中,我习惯于只搜索LOWER(email)= LOWER(搜索),但我发现不能轻易(并且很快)在mongo中完成。

所以我正在尝试做类似的事情:

UPDATE accounts SET email = LOWER(email);

或:

accounts.update_many({}, {
            '$set': {
                'email': lower(email)
            }
        }, upsert=False)

知道如何在Mongo中这样做吗?

PS:我正在使用PyMongo驱动程序

2 个答案:

答案 0 :(得分:2)

我想念你的问题.. 我只能用python函数:)

def accounts_to_lower():
    for account in accounts.find({'email': {'$exists': True}):
        accounts.update_one({'email': account.get('email'}, {
            '$set': {
                'email': account.get('email'}.lower()
            }
        }, upsert=False)

答案 1 :(得分:0)

我为你制作了一个更干净的代码。 :)

def add_user_to_table(table, username, **kwargs):
    """ Add user to given table, with given arguments.
    """
    data = { 'name' : username }
    for key, value in kwargs.iteritems():
        data[key] = value
    table.insert(data)

def update_query_in_table(table, query, action='$set',
        multi=False, **kwargs):
    """ Updates user information using **kwargs.
        Either updates using action='$set' or deletes using action='$unset'
    """
    update = {action : {}}
    for key, value in kwargs.iteritems():
        update[action][key] = value

    upd = table.update(query, update, multi=multi)

if __name__ == '__main__':
    """ Initializing Database
    """
    client = pymongo.MongoClient('localhost', 27017)
    database = client.connectSysDatabase
    userTable = database.users

    # Deletes everything at every run, this is a test program, it won't
    # affects us much here to delete and re-add for the example purpose.
    userTable.delete_many({})

    # Creating our Database
    add_user_to_table(userTable, 'John', grade='member')
    add_user_to_table(userTable, 'Kilian', grade='member')
    add_user_to_table(userTable, 'Raphael', grade='member')

    # Querying all the 'member' in 'grade'.
    query = { 'grade' : 'member' }

    # Will update only one grade to 'Captain'.
    update_query_in_table(userTable, query, multi=False, grade="Captain")

    # Will update all grade to 'Captain'.
    update_query_in_table(userTable, query, multi=True, grade="Captain")

回答下面的评论......“鉴于你的例子,使用用户名==”John“,我如何转换他的用户名,并且每个人都变成小写?”

您需要进行查询,并提供您想要的所有用户的共同点(这是目前的基本编程)。您可以进行{'username': {'$exists': True}{ 'grade' : 'member' }之类的查询。在这里,它会返回每个用户,或每个成员 的用户(因为这是一个只包含用户的集合)。

然后,使用**kwargs,使用您要更新的值进行更新。确实,现在的问题还没有得到解答,因为您需要向func添加一个arg update_query_in_table,以使其像下面的魅力一样工作:

def update_query_in_table(table, query, action='$set',
        multi=False, func=lambda x: x, **kwargs):
    """ Updates user information using **kwargs.
        Either updates using action='$set' or deletes using action='$unset'
    """
    update = {action : {}}
    for key, value in kwargs.iteritems():
        # By default, func does nothing.
        update[action][key] = func(value)

    upd = table.update(query, update, multi=multi)

默认情况下,func不执行任何操作,但您可以使用update (...), func = lambda x: x.lower())执行某些操作。但我们只是在修改一个功能,使更新更清洁更容易(这是pythonic,恕我直言)。我希望你注意的是选项,这就是你正在寻找的。

最初,你想做:

# Considering update_many() works, as I always use "update". :)
accounts.update_many({}, {
            '$set': {
                'email': lower(email)
            }
        }, upsert=False)

你刚刚完成了:

# Considering update_many() works, as I always use "update". :)
accounts.update_many({}, {
            '$set': {
                'email': lower(email)
            }
        }, upsert=False, multi=True)

我希望这会有所帮助。