2016-07-18 137 views
0

我試圖通過單個字段來更新一個mongodb json文檔。我知道這很容易,如果我的數據是在對象數組中,但由於原因和不知情的早期設計選擇,它只是對象內的對象。我的集合中的單個文檔的Mongodb:添加一個字段到嵌入式文檔(無數組)

結構:

{ 
    "_id": 123123, 
    "drivers_teams": { 
    "drivers" : { 
     "4" : { <data> }, 
     "5" : { <data indeed> }, 
     ... 
    }, 
    ... 
    } 
} 

我要添加新的對象如

const collection = db.get('collection'); 
let drivers = { }; 
drivers['111'] = { <new data> }; 

collection.update({}, {$set: { drivers_teams: { drivers } }}, { upsert: true }, function (err, doc) { ... }); 

但結果是,在原始對象「drivers_teams」被全殲,具有隻有它的新領域。

如果我嘗試:

collection.update({}, {$set: { drivers }}, { upsert: true }, function (err, doc) { ... }); 

它不出奇插入一個新的領域的 「司機」 的drivers_teams外

{ 
    "_id": 123123, 
    "drivers" : { <new data> }, 
    "drivers_teams": { <still original> } 
} 

類似的問題(+解決方案),在這裏,但JSON是沒有嵌套像我。 https://groups.google.com/forum/#!topic/mongodb-user/ZxdsuIU94AY

有沒有辦法甚至完成我想要做的?或者我應該放棄並覆蓋整個文件,當我想更新單個字段?這裏

編輯

工作的解決方案是{$set: { 'drivers_teams.drivers.111': <data> }}但我應該提到的是,例如關鍵的「111」實際上是未知的,它來自客戶端在發送更新數據。這就是爲什麼這個新對象是由這個解決方案創建的:dynamically name mongo key field

寫任何類似{ 'drivers_teams.driver.' + key: <data> }會引發錯誤。

回答

1

在'$ set'文檔中給出了在嵌入式文檔或數組中指定字段的方法,可以使用點符號。對於你的情況,你可以這樣做:

collection.update({}, 
    { 
     $set: { "drivers_teams.drivers.111": { <new data> }} 
    }, 
    { upsert: true }, function (err, doc) { ... }); 

https://docs.mongodb.com/manual/reference/operator/update/set/

編輯: 如果是動態生成的字段名,你可以這樣做:

const collection = db.get('collection'); 
let set_obj= { }; 
set_obj['drivers_teams.driver.' + key] = { <new data> }; 

collection.update({}, {$set: set_obj }}) 
+0

就是這樣!非常感謝! – spiritworld

0

你錯過了以上的水平drivers子文檔。在mongo殼,我相信你所需要的是:

db.collection.update({}, {$set: {'drivers_teams.drivers.111': {...}}}) 

將更新文件如:

{ 
    "_id": 123123, 
    "drivers_teams": { 
    "drivers": { 
     "4": {...}, 
     "5": {...}, 
     "111": {...} 
    } 
    } 
} 

請參閱Embedded Documents page瞭解有關通過MongoDB的使用點表示法的更多細節。

相關問題