124

タイトルが示すように、_id でドキュメントの検索 (1 つ) を実行し、存在しない場合は作成し、見つかったか作成されたかに関係なく、コールバックで返します。

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

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

4

4 に答える 4

205

MongoDB 2.4 以降では、アトミックfindOrCreateな操作で一意のインデックス (またはその他の回避策) に依存する必要がなくなりました。

これは、ドキュメントの挿入時にのみ発生する更新を指定できる、2.4の新しい$setOnInsert演算子のおかげです。

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 を持つドキュメントをアップサートし、挿入のみの設定を実行します。どちらの場合も、ドキュメントは返されます。

于 2013-05-03T15:45:11.697 に答える
0

これが私がやったことです(Ruby MongoDBドライバー):

$db[:tags].update_one({:tag => 'flat'}, {'$set' => {:tag => 'earth' }}, { :upsert => true })}

存在する場合は更新し、存在しない場合は挿入します。

于 2016-12-06T18:45:52.710 に答える