2013-05-03 17 views
75

タイトルとして、_idによってドキュメントの検索(1つ)を実行したい場合は作成していますそれが見つかったか作成されたかにかかわらず、コールバックで返されました。MongoDB atomic "findOrCreate":findOne、存在しない場合は挿入しますが、更新しない場合

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

(存在しないの)を作成し、それが実際に誰が話している更新され、それがすべてのように:(

答えて

144

にこの技術の詳細な説明、それは操作のようなアトミックfindOrCreateのためのユニークなインデックス(またはその他の回避策)に頼る必要がなくなりました。

これは、ドキュメントの挿入時にのみ行われる更新を指定できるようにするための、the $setOnInsert operatorの新機能です。

これは、upsertオプションと組み合わせて、findAndModifyを使用して、findOrCreateのような操作を実現できることを意味します。 $setOnInsertとして

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 
}) 

のみ挿入された文書に影響し、既存の文書が発見された場合、何も変更は行われません。文書が存在しない場合は、指定された_idを持つ文書をアップサートし、次に挿入のみを実行します。どちらの場合も、文書が返されます。

+0

コードはmongodbシェルで使用されますが、node.jsコードでどのように使用するのですか? – Gank

+0

私のコードはnode.jsに新しいデータベースを挿入できません。 – Gank

+2

@Gankノードにmongodbネイティブドライバを使用している場合、構文は 'collectionと似ています。findAndModify({_ id: 'theId'}、<あなたのソートオプション>、{$ setOnInsert:{foo: 'bar'}}、{new:true、upsert:true}、コールバック) '。 [the docs](http://mongodb.github.io/node-mongodb-native/api-generated/collection.html)を参照してください – numbers1311407

5

その少し汚れをconfuzzlingだが、あなたはそれを挿入することができます。

を場合、私はわかりませんよ要素は、すでにそれはあなたがキャッチできる例外を返します提示されている場合

は鍵がこのようにして上の一意のインデックス(あなたはそれは大丈夫だ_idを使用している場合、それはすでにユニークです)。

を持っていることを確認してください。

存在しない場合は、新しいd文書が挿入されます。更新

のMongoDB 2.4以降でMongoDB Documentation

+0

これはいい考えですが、既存の値はエラーを返しますが、値自体は返しません。 – Discipol

+3

これは実際には、分離された一連の操作に推奨されるソリューションの1つです(おそらく見つからない場合は作成してください)。http://docs.mongodb.org/manual/tutorial/isolate-sequence-of-operations/ – numbers1311407

+0

@Discipol ifあなたはアトミックな操作のセットをしたい、あなたは最初にドキュメントをロックし、それを修正し、最後にリリースする必要があります。これにより、より多くのクエリが必要になりますが、最適なケースのシナリオを最適化し、たいていの場合は1-2回だけクエリを実行できます。 参照:http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ – Madarco

0

は、ここで私は(ルビーMongoDBのドライバを)やったことだ:

それはそれが存在する場合はそれを更新し、そうでない場合は、それを挿入します。

関連する問題