2015-01-14 60 views
0

我有類似下面的文檔:如何更新其父鍵有空格的子文檔?

{ 
    "_id" : ObjectId("54b60ee28115386561cda04b"), 
    "a b" : "{c:d}", 
} 

我需要更新「一b'.c重視‘E’。下面

db.test.update({"_id" : ObjectId("54b60ee28115386561cda04b")}, {$set:{'a b.c':'e'}}); 

試圖詢問,但得到的錯誤:

LEFT_SUBFIELD only supports Object: a b not: 2 

有什麼建議嗎?

+0

尼爾。我知道這不是一個好主意,但是這個屬性來自外部來源,我無法控制價值。 – Lee

回答

1

在鍵名中留出空間沒有任何問題(除非它看起來很糟糕,並不是一個好習慣)。所以你可以修改一個沒有問題的正確文件。

{ 
    "_id" : ObjectId("54b60ee28115386561cda04b"), 
    "a b" : { "c": "d" } 
} 

和更新:

db.test.update(
    { "_id": ObjectId("54b60ee28115386561cda04b") }, 
    { "$set": { "a b.c": "e" } } 
); 

但在這裏你的問題是, 「A B」 的內容是一個字符串。所以沒有「c」子屬性來訪問。

{ 
    "_id" : ObjectId("54b60ee28115386561cda04b"), 
    "a b" : "{c:d}", 
} 

更正文檔包含嵌套對象:

db.test.update(
    { "_id": ObjectId("54b60ee28115386561cda04b") }, 
    { "$set": { "a b": { "c": "e" } } } 
); 

將來的更新將正常工作,然後

+0

這是否意味着'一個b'會在這個查詢後失去所有其他的子屬性,如果有的話? – Lee

+1

@Ming沒有子屬性,因爲「它是一個字符串」。如果你的東西看起來像''a b「:」{c:d,e:f}「'那麼這個值是一個」字符串「而不是一個對象,你可能有一些不好的代碼導致了這種情況。我告訴你這個錯誤以及如何改正它。 –

+0

謝謝,尼爾。得到它。 – Lee