2016-09-21 75 views
1

我在MongoDB中更新數組元素時遇到問題。這是一個文件的結構:如何更新MongoDB文檔中的數組元素

{ 
     "_id" : ObjectId("57e2645e11c979157400046e"), 
     "site" : "BLABLA", 
     "timestamp_hour" : 1473343200, 
     "values" : [ 
       { 
         "1473343200" : 66 
       }, 
       { 
         "1473344100" : 230 
       }, 
       { 
         "1473345000" : 479 
       }, 
       { 
         "1473345900" : 139 
       } 
     ] 
} 

現在我想用鍵「1473345900」更新元素。我怎樣才能做到這一點?我已經試過:

db.COLLECTIONNAME.update({"values.1473345900": {$exists:true}}, {$set: {"values.$": 0}}) 

但在那之後文檔的樣子:

{ 
     "_id" : ObjectId("57e2645e11c979157400046e"), 
     "site" : "BLABLA", 
     "timestamp_hour" : 1473343200, 
     "values" : [ 
       { 
         "1473343200" : 66 
       }, 
       { 
         "1473344100" : 230 
       }, 
       { 
         "1473345000" : 479 
       }, 
       0 
     ] 
} 

我做錯了嗎?我只想將1473345900的值更新爲任何值...我不想更新完整元素...

非常感謝!

回答

2

您需要在更新中添加一個與您想要更新的數組元素相匹配的附加查詢。典型的查詢將涉及檢查元素的值不等於正在更新的元素的值。

下面的示例示出了更新這其中$位置操作者識別所述散列密鑰數組元素{ "1473345900": 139 }的正確索引位置。如果您嘗試沒有$位置運營商運行的更新操作:

db.COLLECTIONNAME.update(
    { "values.1473345900": { "$exists": true } }, 
    { "$set": { "values.1473345900": 0 } } 
) 

蒙戈將把時間戳1473345900的索引位置,因此你會得到錯誤

不能回填陣列,以大於1500000個元件

因此正確的方法應該是:

var val = 32; 
db.COLLECTIONNAME.update(
    { "values.1473345900": { "$ne": val, "$exists": true } }, 
    { "$set": { "values.$.1473345900": val } } 
) 
+0

問題是:我不知道** 1473345900 **是否已經存在。所以1)我必須找出** 1473345900 **是否存在,以及2)我必須更新** 1473345900 **的值。對不起,我錯過了解釋... – tmieruch

+1

'db.sites.update({「values.1473345900」:{$ exists:true}},{$ set:{「values。$。1473345900」:0}}) '會做到這一點。 Thx,Chridam !!! – tmieruch

相關問題