2016-04-29 127 views
0

我有簡單的文檔:蒙戈DB更新語句

/* 1 */ 
{ 
    "_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
    "Settings" : [ 
     [ 
      "Storage", 
      "Dedicated" 
     ], 
     [ 
      "Country", 
      "EE" 
     ], 
     [ 
      "Address", 
      "http://localhost:55557" 
     ], 
     [ 
      "Number", 
      "05" 
     ] 
    ] 
} 

無法弄清楚如何寫更新語句,更新地址信息"http://localhost:55557"到IP address.something像http://10.10.20.2:66667

+2

這種模式在MongoDB中查詢和更新非常困難。考慮修改模式,以便將嵌入式數組平鋪到具有適當字段/值對的文檔中。 – chridam

+0

chridam-我不能更新架構,如果我可以用適當的字段/值對修復它。我知道這不是一件好事。 – vencrena

回答

3

架構設計是不正確,因爲沒有您想要更新的值的關鍵字。考慮更改架構如下

{ 
_id : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
settings : 
    { 
     storage:"Dedicated", 
     country:"EE", 
     address:"http://localhost:55557", 
     number:"05" 
    } 
} 

上面的架構具有用於設置每個值的關鍵,而不是一個雙陣列。上述文檔中的任何值都可以訪問和編輯。

如下

db.settings.update({ 
    _id: "9cbfceec-d6f6-5638-b7c9-49103dc39665" 
}, { 
    $set: { 
    "settings.address": "http://10.10.20.2:66667" 
    } 
}); 
+0

如果架構良好,您建議的解決方案應該可以工作。但它不能解決我的雙陣列問題。我不能修改架構。 – vencrena

+1

沒有辦法直接訪問地址,因爲地址不是關鍵。地址是數組中的第一個元素,與其關聯的值是第二個值。所以唯一的辦法是找到文檔,通過在數組上迭代時進行字符串比較來檢索設置數組並找到地址。然後您將更新文檔中的值,然後更新集合中的整個文檔。 –

+0

是的,我已經使用你提出的模型,所以我認爲它可以做得更容易。謝謝你的幫助。 – vencrena

0

chirdam是正確的有關架構然後,您可以更新文檔。

如果你沒有準備,使新的架構,你可以嘗試以下操作:

嘗試此查詢:

db.yourCollection.update({"_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", "Settings.Address" : "http://localhost:55557"} , { $set : {"Settings.$.Address" : "http://10.10.20.2:66667"}}); 

或者另一種方法是使用RoboMongo手動編輯您的收藏

+0

我瞭解該模式。你的解決方案對我來說也沒有幫助,因爲它是雙數組。 – vencrena