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' }
この複製を停止する方法。どのフィールドでインデックスを作成する必要がありますか?
挿入を使用しないでください。
upsert=true
で更新 を使用します。更新はクエリに一致するドキュメントを検索し、必要なフィールドを変更してから、クエリに一致するドキュメントがない場合に挿入する場合はupsert:Trueを指定できます。
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
したがって、あなたの例では、次のようなものを使用できます。
db.collection.update(doc, doc, {upsert:true})
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/
上記の回答から更新されました。
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
です。