updateone upsertとマルチ構文によるMongodbの更新



updateone mongodb upsert (1)

異なる基準に基づいて複数のレコードを更新することはできませんし、あなたが意味するものを理解するために "upsert"が必要です。 Upsertフラグは多くとも1つのドキュメントの挿入を引き起こす可能性があり、ドキュメントをチェックすると、アップサートの場合に更新のための「複合」基準を持つことは意味をなさないことがわかります。

あなたの例では、2つのfbid値のどちらを挿入に使うべきですか?

私はあなたのケースでは、いくつかのアプローチを取ることができると思います。 fbid値ごとにupdateを呼び出してループ内のupsertフラグを使って更新することができます。これは期待どおりに動作し、fbidが見つからなければ新しい文書が作成されます。 他の方法では、更新プログラムを実行する前にクエリを実行する必要がありますが、これらの方法は競合状態になりやすい可能性があります。

ここでは、アップデートのしくみについて説明します。かなり完成しています: http : //docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

私はmongodbに新しく、mongodbの不完全な文書が試行錯誤のために残っているためにストレスを受けています...悲しいことに、私のすべての試みは何のエラーもなく、何が起こっているのか、何をデバッグするのか混乱しています...

特定の条件を満たすデータベース上の複数のレコードを更新するだけでよく、既存のレコードでない場合は、新しいエントリを作成する必要があります。 私は更新、upsertとマルチとの単一のデータベースアクセスでそれを行うことができると信じています。 ここに私が思いついたことがあります:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } } );

私はまた、複数の組み合わせを試したり、古いバージョンを試してみました:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true } );

どれもうまくいきません...

これほど些細なもので私を助けてください...私は簡単にSQLでそれを行うことができますが、nosqlのthingyは私に制限されて..ありがとう!

編集:

findに関する同じクエリは完全に機能します:

dbschema.Person.find( { person_id: { $in: ["734533604" ,"701084015"] } }, function ( err, results ) {
    console.log( 'result: ' + results );
    console.log( 'error: ' + err );
    console.log( 'result length: ' + results.length );
} );

編集:

私は "見つからない"レコードが作成され、見つかったレコードが更新されることを期待しています。 私の論理に欠陥があるかもしれないし、今私はとても混乱している。

もともと、私は一度に1レコードを見つけて値を変更し、変更されたレコードごとにsave()を呼び出しましたが、ライブにデプロイしたときに応答時間は特に毎回更新される数百のレコード。

それで、find()+ $ inが見つかったので、パフォーマンスは以前のもの(クエリのとき)よりも良くなりました。しかし、更新は依然として受け入れられないほど遅いので、今はすべてのドキュメントを1つのクエリで更新する方法を探しています。 。

私が通常SQLで何をしているのかは、その時の更新を使っています...例:

UPDATE person SET score = CASE
WHEN person_id = "734533604" THEN 1200
WHEN person_id = "701084015" THEN 1200
ELSE
score
END




nosql