0

私のアップサートリクエストでは、次の両方を行いたいと思います。

  • オブジェクトが存在する場合は、その場所でオブジェクトを更新します。

    db.somecollection.update({x: 1}, {$inc: {x: 1}});
    
  • そこにない場合は、新しいオブジェクトを提供します。

    db.somecollection.update({x: 1}, {whole: 0, new: 'yata', object: 42});
    

それを行う方法はありますか?

問題は、アップサートは、修飾子ではなく、最初にオブジェクトをすでに提供している場合にのみ機能するように見えることです。

編集:より具体的にします。

フォームのオブジェクトを更新したい

{_id: 12, a: 123, b: 234, c: 345}

a私の更新は、、bまたはのいずれかで1の増分ですc。オブジェクトがベースにない場合は、フォームのオブジェクトを作成したいと思います

{_id: 13, a: 1, b: 0, c: 0}

aインクリメントしようとしたフィールドがあれば。

さて、マニュアルを正しく読めば、書くことができます

db.somecollection.update({_id: 12}, {$inc: {a: 1}}, true);

これは私のフィールドを更新するためにうまく機能しaますが、フィールドbを作成cせず、オブジェクトが存在しない場合。

4

1 に答える 1

1

アップサートは修飾子を使用できます。新しいドキュメントを作成する必要がある場合、修飾子はセレクター/基準オブジェクトに適用されます。ここを参照してください。ただし、呼び出しでupsertパラメータをに設定する必要があります。trueupdate

db.somecollection.update({x: 1}, {$inc: {x: 1}}, true);

アップデート

探している動作を取得するには:

db.somecollection.update({_id: 12}, {$inc: {a: 1, b: 0, c: 0}}, true);
于 2012-08-29T16:42:12.190 に答える