2017-11-08 3 views
0

私は学生オブジェクトのコレクションを持っています。私はこの学生のドキュメントをMongoDBコレクションに持っていて、この学生が持っているコースの1つに属する教師を更新したい。たとえば、データベースコースに属するDannyの名前を更新したいとします。MongoDBの二重ネストされた配列内のオブジェクトを更新しています

{ 
    "firstName": "John", 
    "lastName": "Wayne", 
    "age": 25, 
    "bbId": "johx0055", 
    "courses" : [ 
     { 
      "name" : "Web development", 
      "teachers" : [ 
       { 
        "firstName" : "Bob", 
        "lastName" : "Birch" 
       } 
      ] 
     }, 
     { 
      "name" : "Interface Design", 
      "teachers" : [ 
       { 
        "firstName" : "Roxanna", 
        "lastName" : "Doe" 
       } 
      ] 
     }, 
     { 
      "name" : "Databases", 
      "teachers" : [ 
       { 
        "firstName" : "Jack", 
        "lastName" : "X" 
       }, 
       { 
        "firstName" : "Danny", 
        "lastName" : "Doe" 
       } 
      ] 
     } 
    ] 
} 

これをnodejs環境で更新しようとしています。私はこのクエリを使用してみました、これは適切なソリューションに私が得た最も近かった:0が示されているように、

db.collection('students').update({ 'bbId' : johx0055, 'courses.name' : 'Databases', 'courses.teachers.firstName' : 'Danny'}, { $set : { 'courses.$.teachers.0.firstName' : 'X' }}, (err, result) => { 
    if (err) { 
     console.log(err); 
     //console.log({ "status": "error", "type": "001 -> create student", "message": "Error when updating teacher" }); 
     return; 
    } 
    console.log({ "status": "OK", "message": "Successfully updated teacher" }); 
}) 

しかし、唯一の教師配列の最初の要素(ジャック)を更新

+0

インデックスキーはどのキーですか? –

答えて

0

まず第一にmongodbが適切なストレージソリューションであるかどうかを尋ねてください。このデータは非常にリレーショナルなものです(コースが変更されるたびにすべての生徒を更新したいのですか?)

これは、ドキュメント全体を新しいもので上書きすることだと言われています欲しいです。

var new_doc = {...} 
db.save(new_doc) 
+0

これは、MongoDBデータベースを照会する方法を学ぶために、MongoDBを使用する必要がある課題の一部です。 db.save(new_doc)は既存のオブジェクトを上書きしますか? – Roi

+0

mongodbのすべてのドキュメントにインデックスキーがあります。新しいドキュメントを保存すると、そのインデックスキーが検索されます。 存在しない場合:新しいドキュメントを保存します 存在する場合は、それを持つドキュメントを更新します。 私が推測しなければならないのは、bbIdがこのdbのインデックス付きキーだと思います。しかし、 'collection.indexInformation()'を使ってチェックすることができます。 –

関連する問題