web-dev-qa-db-ja.com

mongodbコレクションへの重複ドキュメントの挿入を停止する方法

3つのドキュメントを持つMongoDBコレクションを用意しましょう。

db.collection.find()

 { _id:'...', user: 'A', title: 'Physics',   Bank: 'Bank_A' }
 { _id:'...', user: 'A', title: 'Chemistry', Bank: 'Bank_B' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }

ドキュメントがあります

 doc = { user: 'B', title: 'Chemistry', Bank:'Bank_A' }

使用する場合

 db.collection.insert(doc) 

ここでは、この重複したドキュメントがデータベースに挿入されます。

 { _id:'...', user: 'A', title: 'Physics',   Bank: 'Bank_A' }
 { _id:'...', user: 'A', title: 'Chemistry', Bank: 'Bank_B' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }
 { _id:'...', user: 'B', title: 'Chemistry', Bank: 'Bank_A' }

この複製を停止する方法。どのフィールドでインデックスを作成する必要がありますか?

37
shashank

挿入を使用しないでください。

upsert=trueで更新 を使用します。更新はクエリに一致するドキュメントを検索し、必要なフィールドを変更してから、クエリに一致するドキュメントがない場合に挿入する場合はupsert:Trueを指定できます。

db.collection.update(
   <query>,
   <update>,
  {
    upsert: <boolean>,
     multi: <boolean>,
    writeConcern: <document>
   }
  )

したがって、あなたの例では、次のようなものを使用できます。

db.collection.update(doc, doc, {upsert:true})
49
Vic

MongoDBコレクション内のドキュメントを一意に識別するフィールドのセットで複合インデックスを使用する必要があります。たとえば、ユーザー、役職、銀行の組み合わせが一意のキーであると判断した場合、次のコマンドを発行します。

db.collection.createIndex( { user: 1, title: 1, Bank: 1 }, {unique:true} )

これは、以前に保存された重複を削除した後に行う必要があることに注意してください。

http://docs.mongodb.org/manual/tutorial/create-a-compound-index/

http://docs.mongodb.org/manual/tutorial/create-a-unique-index/

28
John Petrone

上記の回答から更新されました。

db.collection.updateOne()の代わりにdb.collection.update()を使用してください。 db.collection.createIndexes()の代わりにdb.collection.ensureIndex()

更新:メソッドupdate()およびensureIndex()はmongodb 2. *から廃止されました。詳細は mongo で確認でき、パスは_./mongodb/lib/collection.js_です。 update()の場合、推奨されるメソッドは_updateOne, updateMany, or bulkWrite_です。 ensureIndex()の場合、推奨される方法はcreateIndexesです。

5
Creem