addToSet 并使用 PyMongo 和 MongoDB 在同一更新中设置
addToSet and set in same update using PyMongo and MongoDB
在 MongoDb 中是否可以对除已更新的字段以外的所有内容执行更新,例如使用 addToSet?
我将信息存储在 python 词典中,该词典由用户更新。然后我想使用这个字典来更新 MongoDb 中的条目。其中一个字段是一个数组,如果不存在,我想插入字典值。其他的都可以换。我遇到的问题是,对整个字典使用 set 会将数组替换为单个值。为了说明问题:
我创建了一个字典
thing = {}
thing['name'] = 'fruit'
thing['color'] = 'green'
thing['types'] = ['apple', 'pear', 'kiwi']
我插入:
c_users.insert_one(thing)
用户标记了一些要更新的字段
thing2 = {}
thing2['name'] = 'fruit'
thing2['color'] = 'darkgreen'
thing2['types'] = 'mango'
然后我尝试更新数据库
c_users.update({'name':thing2['name']}, {'$addToSet':{'types':thing2['types']} ,'$set':{'color':thing2}})
这个方法是否可行?如果不是,还有其他方法可以达到相同的最终结果,例如使用变量而不是 thing2['types'] 但最好将所有值保留在字典中。
您可以从更新文档中弹出 'types' 值:
>>> c_users.find_one()
{u'color': u'green', u'_id': ObjectId('553fddc967d5bd0b07022477'), u'name': u'fruit', u'types': [u'apple', u'pear', u'kiwi']}
>>> thing2 = {'name': 'fruit', 'color': 'darkgreen', 'types': 'mango'}
>>> c_users.update({'name': thing2['name']}, {'$addToSet': {'types': thing2.pop('types')}, '$set': thing2})
{u'nModified': 1, u'ok': 1, u'n': 1, 'updatedExisting': True, u'electionId': ObjectId('553fc845f09926d0bb959eb7'), u'lastOp': Timestamp(1430249053, 1)}
>>> c_users.find_one()
{u'color': u'darkgreen', u'_id': ObjectId('553fddc967d5bd0b07022477'), u'name': u'fruit', u'types': [u'apple', u'pear', u'kiwi', u'mango']}
在 MongoDb 中是否可以对除已更新的字段以外的所有内容执行更新,例如使用 addToSet?
我将信息存储在 python 词典中,该词典由用户更新。然后我想使用这个字典来更新 MongoDb 中的条目。其中一个字段是一个数组,如果不存在,我想插入字典值。其他的都可以换。我遇到的问题是,对整个字典使用 set 会将数组替换为单个值。为了说明问题:
我创建了一个字典
thing = {}
thing['name'] = 'fruit'
thing['color'] = 'green'
thing['types'] = ['apple', 'pear', 'kiwi']
我插入:
c_users.insert_one(thing)
用户标记了一些要更新的字段
thing2 = {}
thing2['name'] = 'fruit'
thing2['color'] = 'darkgreen'
thing2['types'] = 'mango'
然后我尝试更新数据库
c_users.update({'name':thing2['name']}, {'$addToSet':{'types':thing2['types']} ,'$set':{'color':thing2}})
这个方法是否可行?如果不是,还有其他方法可以达到相同的最终结果,例如使用变量而不是 thing2['types'] 但最好将所有值保留在字典中。
您可以从更新文档中弹出 'types' 值:
>>> c_users.find_one()
{u'color': u'green', u'_id': ObjectId('553fddc967d5bd0b07022477'), u'name': u'fruit', u'types': [u'apple', u'pear', u'kiwi']}
>>> thing2 = {'name': 'fruit', 'color': 'darkgreen', 'types': 'mango'}
>>> c_users.update({'name': thing2['name']}, {'$addToSet': {'types': thing2.pop('types')}, '$set': thing2})
{u'nModified': 1, u'ok': 1, u'n': 1, 'updatedExisting': True, u'electionId': ObjectId('553fc845f09926d0bb959eb7'), u'lastOp': Timestamp(1430249053, 1)}
>>> c_users.find_one()
{u'color': u'darkgreen', u'_id': ObjectId('553fddc967d5bd0b07022477'), u'name': u'fruit', u'types': [u'apple', u'pear', u'kiwi', u'mango']}