2016-07-18 8 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

私がしようとしていることを達成する方法はありますか?または、私は単一のフィールドを更新するときに、ドキュメント全体をあきらめて上書きする必要がありますか?ここ

EDIT

作業溶液は{$set: { 'drivers_teams.drivers.111': <data> }}ですが、私が言及している必要がありますすることは、その一例キー「111」は、更新データを送信するとき、それはクライアントから実際には不明来るです。そのため、このソリューションでは新しいオブジェクトが作成されました。{ 'drivers_teams.driver.' + key: <data> }のような記述は、エラーをスローします。dynamically name mongo key field

答えて

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": {...} 
    } 
    } 
} 

のMongoDBで使用されるドット表記法に関する詳細についてはEmbedded Documents pageを参照してください。

関連する問題