1. ホーム
  2. node.js

[解決済み] MongoDB atomic "findOrCreate": findOne, insert if nonexistent, but do not update

2022-08-02 18:38:48

質問

タイトルの通り、_idでドキュメントを検索(1件)し、存在しない場合は作成し、見つかったか作成されたかをコールバックで返したいのです。

私はfindAndModifyがそうするのを読んだように、それが存在する場合、私はそれを更新したくありません。私はこれに関してStackoverflowで他の多くの質問を見ましたが、再び、何も更新したくありません。

私は(存在しないの)作成によって、thatが実際に誰もが話している更新であるかどうかわからない、それはすべてとても混乱している:(。

どのように解決するのですか?

MongoDB 2.4 以降、一意なインデックス (あるいはその他の回避策) を使ってアトミックな findOrCreate のような操作のために一意なインデックスやその他の回避策に頼る必要はなくなりました。

これは のおかげです。 $setOnInsert 演算子 は 2.4 の新機能で、ドキュメントを挿入するときにのみ起こるべき更新を指定することができます。

この演算子と upsert オプションと組み合わせることで findAndModify を使うと、アトミックな findOrCreate -のような操作になります。

db.collection.findAndModify({
  query: { _id: "some potentially existing id" },
  update: {
    $setOnInsert: { foo: "bar" }
  },
  new: true,   // return new doc if one is upserted
  upsert: true // insert the document if it does not exist
})

として $setOnInsert は挿入されるドキュメントにのみ影響するので、 既存のドキュメントが見つかった場合は何も変更されません。 ドキュメントが存在しない場合、指定された_idを持つドキュメントをupsertし、挿入のみのセットを実行します。 どちらの場合も、ドキュメントは返されます。