2015-07-21 72 views
2

如何更新记录的字面元素以添加新密钥(如果不存在)或更新密钥的相应值(如果存在)。 例如:pymongo,mongodb为现有字典添加新密钥

record = {'_id':1, 
      'value': {'key1' : '200'}} 

祝通过添加新的键 - 值对,以更新'value'。例如value={'key2':'300'}。所以我的期望更新的记录是:

record = {'_id':1, 
       'value': {'key1' : '200', 
          'key2' : '300'}} 

我已经试过:

value={'key2':'300'} 
    mongo.db['mydb'].update(
      {'_id': 1}, 
      {'$set': {'value': value}}) 

但它覆盖的“价值”,不新密钥添加到它:

record = {'_id':1, 
      'value': {'key2' : '300'}} 

我该如何实现这一目标?

回答

1

您需要使用"dot notation"

In [20]: col.find_one() 
Out[20]: {'_id': 1, 'value': {'key1': '200'}} 

In [21]: col.update({'_id': 1}, {'$set': {'value.key2': 300}}) 
Out[21]: {'n': 1, 'nModified': 1, 'ok': 1, 'updatedExisting': True} 

In [22]: col.find_one() 
Out[22]: {'_id': 1, 'value': {'key1': '200', 'key2': 300}} 

编辑

如果你的关键是变量的所有你需要的是串联:

In [37]: key2 = 'new_key' 

In [38]: col.update({'_id': 1}, {'$set': {'value.' + key2: 'blah'}}) 
Out[38]: {'n': 1, 'nModified': 1, 'ok': 1, 'updatedExisting': True} 

In [39]: col.find_one() 
Out[39]: {'_id': 1, 'value': {'key1': '200', 'new_key': 'blah'}} 
+0

如果什么''key2''存储在一个变量中,我仍然可以使用点符号吗? (它来自客户端的一个表单,并存储在一个变量中) – CentAu

+0

您仍然可以使用点符号'{'$ set':{'value.key2':key2}}' – styvane

+0

我的意思是假设key2是一个变量例如''键2 ='new_key'''。我使用了''{'$ set':{'value.key2':'blah'}}'',它给了我:'{'value':{'key2':'blah'}}',Where因为我需要:'{'value':{'new_key':'blah'}}'' – CentAu

相关问题