2016-08-17 13 views
0

アップドキュメントを使用してすべての子ドキュメントIDの配列で親ドキュメントを更新しようとしています。問題は、upsertによって挿入が発生した場合にのみIDが返されることです。更新されたドキュメントのObjectIDを取得します。

私は新しい子供が挿入されているときに動作する次のコードを持っていますが、一度更新されると、結果upsertedIdがnullであるために約束がロックアップされます。

 let promises = []; 
     parent.children.forEach(child => { 
      //Child contains everything except the _id 
      promises.push(database.collection('Children').updateOne(
       child, 
       child, 
       { 
        upsert: true 
       } 
      )); 
     }); 

     Promise.all(promises).then(result => { 
      delete parent.children; 
      parent.childIds = result.map(upsert => new ObjectId(upsert.upsertedId._id)); //ONLY THERE ON INSERT? 
      database.collection('Parents').updateOne({ 
       parentId: obj.parentId 
      }, obj, { 
       upsert: true 
      }).then(() => { 
       //some success functionality 
      }, error => { 
       //some error functionality 
      }); 
     }, error => { 
      //some error functionality 
     }); 
+0

項目:http://stackoverflow.com/questions/14481521/get-the-id-of-inserted-document-in-mongo-databaseここ

は私の問題を修正したコードです-in-nodejs – Wake

+0

おかげで@Wakeは不幸にも、私の問題を解決しませんでした。しかし、私は今それを考え出した。答えを1秒後に投稿します。 –

答えて

1

解決策は、findOneAndUpdateメソッドを使用していたようです。このメソッドは、オブジェクトを見つけて更新し、ドキュメントを返します。また、upsertパラメーターも受け入れます。したがって、特定の文書が見つからないときに挿入が実行されます。

更新が実行された場合、結果にはvalueフィールドの下にドキュメントが含まれます。

挿入が実行される(upsertがtrueの場合)フィールドlastErrorObject.upsertedは結果オブジェクトに設定され、valueフィールドはnullになります。

 let promises = []; 
     parent.children.forEach(child => { 
      promises.push(database.collection('Children').findOneAndUpdate(
       child, 
       child, 
       { 
        upsert: true 
       } 
      )); 
     }); 

     Promise.all(promises).then(result => { 
      delete parent.children; 
      parent.childrenIds = result.map(upsert => new ObjectID(upsert.lastErrorObject.upserted || upsert.value._id)); 
      database.collection('Parents').updateOne({ 
       parentId: parent.parentId 
      }, obj, { 
       upsert: true 
      }).then(() => { 
       //some success functionality 
      }, error => { 
       //some error functionality 
      }); 
     }, error => { 
      //some error functionality 
     }); 
関連する問題