基本上我的帐户设置如下:
{
'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驱动程序
答案 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,恕我直言)。我希望你注意的是多选项,这就是你正在寻找的。 p>
最初,你想做:
# 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)
我希望这会有所帮助。