我一直無法進入我的MongoDB集合並更改複雜文檔中的值。我嘗試了比下面所示的一個例子更多的變化,各種變化,但都失敗了。MongoDB中複雜文檔update()的尋址問題是什麼?
我想將密鑰「空氣」的值從「雨」更改爲「清除」。在現實生活中,我不知道現在的關鍵「空氣」的價值是「下雨」。
請注意,我沒有使用MongoDB _id對象,並且希望在不使用它的情況下完成此操作。
3個文檔weatherSys集合中:
{
"_id" : ObjectId("58a638fb1831c61917f921c5"),
"SanFrancisco" : [
{ "sky" : "grey" },
{ "air" : "rain" },
{ "ground" : "wet" }
]
}
{
"_id" : ObjectId("58a638fb1831c61917f921c6"),
"LosAngeles" : [
{ "sky" : "grey" },
{ "air" : "rain" },
{ "ground" : "wet" }
]
}
{
"_id" : ObjectId("58a638fb1831c61917f921c7"),
"SanDiego" : [
{ "sky" : "grey" },
{ "air" : "rain" },
{ "ground" : "wet" }
]
}
var docKey = "LosAngeles";
var subKey = "air";
var newValue = "clear";
var query = {};
//var queryKey = docKey + ".$";
query[query] = subKey; // query = { }
var set = {};
var setKey = docKey + ".0." + subKey;
set[setKey] = newValue; // set = { "weather.0.air" : "clear" }
db.collection('weatherSys').update(query, { $set: set }, function(err, result) {
if (err) throw err;
});
UPDATE-1: 好了,我希望我能找到一個佈局簡單一些比你建議,但我失敗了。我試過的所有東西都無法在「空氣」鍵級別上尋址。所以我複製並粘貼你的確切的JSON到我的收藏集並運行它。我使用MongoChef來操作和測試集合。
這是我的新佈局從粘貼在3倍的JSON掘進創建3個文件:
當我再嘗試更新的「舊金山」文檔的「空氣」鍵我有一個意外的結果。而不是更新的「空氣」:「幹」它開創了「舊金山」的對象一個新的「空氣」鍵:
所以我想好吧,讓我們重新嘗試更新,看看會發生什麼:
正如你可以看到它更新了它先前創建的 「空氣」 鍵。我打了這一點,並試圖使其工作「我」的方式,但我只是希望它的工作,所以我又重新在我的收藏佈局,沿着什麼是線「工作」:
而且再次運行更新:
然後我再次運行更新驗證:
它的工作原理,我在多文檔環境中正確更新。所以這是我當前的工作集佈局:
我有一個關於這個 -
我使用在頂級密鑰「天氣」幾個問題每份文件。它並沒有增加文件內的信息。是否有一個佈局設計更改,不需要密鑰和它帶來的開銷?
可以說我有使用「全天候」的關鍵。它的值是一個數組,但該數組只有一個元素,包含鍵的對象:城市,天空,空氣和地面。尋址是否需要僅使用一個元素的數組?或者我可以擺脫它。而不是「天氣」:[{}]設計可能是「天氣」:我還是會再次陷入非尋址問題?
看來我現在可以更新()鍵的任何值:空氣,天空和地面,但什麼是find()結構可以說讀取鍵的值「地面」的一個文件?
----> OK,我覺得我有這個問題#3- db.weatherSys.find({ 「weather.city」: 「舊金山」},{「weather.ground 「:1})
- 在您建議的原始集合佈局中,能否向我解釋爲什麼它沒有按照我們的預期更新,而是創建了一個新的「城市」對象?
這裏有很多。我感謝你堅持下去。
非常有趣!你的代碼有效!但是我完全沒有期望查詢對象將是空的,所以我的例子顯然被修剪過了。環境由許多具有相同結構的文檔組成。我錯誤地認爲簡單更好。請問您是否再次查看它,因爲查詢的關鍵結構確實阻止了我訪問正確的文檔。謝謝。 – Ric
更新答案根據您的更新添加選項。請驗證並讓我知道。 – Veeram
有趣的想法,非常有幫助。讓我想想這個。我會回來的。 – Ric