1

NodeJSで実行されているtypescriptコードを使用して、mongodbドキュメントに文字列の配列を挿入/更新しようとしています。次のコードはタイプスクリプトですが、JS開発者は問題なく取得できると思います。

export function addEvents(entityId: string, 
                          events: string[] , 
                          callback: () => void) {

   db.collection('events', function(error, eventCollection) {
       if(error) { 
           console.error(error); return; 
       }
       eventCollection.update({ _id: entityId }, { "$pushAll ": 
       { events: events }},
           function(error, result) {
               if(error) { 
                   console.error(error); return; 
               }
               callback();
           });
   });
}

ドキュメントの構造は次のとおりです。

{
    _id : string
    events : ["array","of","strings"]
}

特定の_idの既存の配列の最後に配列文字列を追加したいだけです。

update、save、$ push、$pushallなどを使用する必要があるかどうかはわかりません。

誰かが説明できますか?

4

4 に答える 4

2

私が正しく理解した場合、問題はpushAllが何もしないか、updateがエラーを返すことです。あなたの例ではコピー&ペーストの間違いかもしれませんが、ここにタイプミスがあると思います。

{ "$pushAll ":  { events: events }}

そのはず

{ $pushAll: { events: events }}
于 2012-10-31T15:49:34.637 に答える
2

updateと$pushAllの組み合わせは、ここで行っていることの最良の選択のように見えます。これは、既存の配列に配列を追加するためのものです。$ pushは、配列に要素を追加するためのものです。保存には、既存のイベント配列を取得し、それに追加してから、ドキュメントを保存することが含まれます。

「$pushAll」の余分なスペースを削除する必要があります。引用符が含まれている場合があります:"$pushAll"。

于 2012-10-31T17:03:49.863 に答える
1

問題が見つかったので、更新関数の3番目の引数として「{upsert=true}」を渡す必要がありました。

于 2012-11-01T07:24:26.637 に答える
1

この場合、「upsert」セマンティクスを実現するには、を使用する必要があります$addToSet。追加する値の配列がある場合は、$each修飾子をスローする必要があります。mongoシェルから:

db.events.update(
    { _id: entityId },
    { $addToSet: { $each: events } }
)
于 2014-01-25T05:38:13.717 に答える