2015-07-21 73 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

相關問題