私はmongodbの初心者です。エントリの重複を避ける方法を教えてください。リレーショナルテーブルでは、それを避けるために主キーを使用します。 javaを使用してMongodbで指定する方法を知っていますか?
{unique:true}
オプションでインデックスを使用します。
// everyone's username must be unique:
db.users.createIndex({email:1},{unique:true});
複数のフィールドでこれを行うこともできます。 詳細と例については、ドキュメントの このセクションを参照してください。
MongoDBインデックスは、オプションでユニークキー制約を課すことができます。これにより、インデックスキーの値が既存のドキュメントの値と一致するドキュメントが挿入されないことが保証されます。
null
値を一意のキーから無視する場合は、インデックスをスパースにする必要もあります(see here )、sparse
オプションも追加します。
// everyone's username must be unique,
//but there can be multiple users with no email field or a null email:
db.users.createIndex({email:1},{unique:true, sparse:true});
MongoDB Java Driverを使用してインデックスを作成する場合。試してみてください。
Document keys = new Document("email", 1);
collection.createIndex(keys, new IndexOptions().unique(true));
これは「_id」フィールドを使用して実行できますが、この使用は推奨されません。名前を一意にする場合、「_ id」列に名前を入力できます。ご存知のとおり、「_ id」列は各エントリで一意です。
BasicDBObject bdbo = new BasicDBObject("_id","amit");
これで、コレクション内の「amit」という名前を持つエントリは他にありません。これは、あなたが求めている方法の1つです。
Mongoのv3.0 Javaドライバーでは、インデックスを作成するコードは次のようになります。
public void createUniqueIndex() {
Document index = new Document("fieldName", 1);
MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName");
collection.createIndex(index, new IndexOptions().unique(true));
}
// And test to verify it works as expected
@Test
public void testIndex() {
MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName");
Document newDoc = new Document("fieldName", "duplicateValue");
collection.insertOne(newDoc);
// this will throw a MongoWriteException
try {
collection.insertOne(newDoc);
fail("Should have thrown a mongo write exception due to duplicate key");
} catch (MongoWriteException e) {
assertTrue(e.getMessage().contains("duplicate key"));
}
}
私はJavaプログラマーではありませんが、おそらくこれを変換できます。
MongoDBには、デフォルトで__id
_と呼ばれる主キーがあります。このキーでupsert()
またはsave()
を使用して、ドキュメントが次のように2回書き込まれないようにすることができます。
_var doc = {'name': 'sam'};
db.users.insert(doc); // doc will get an _id assigned to it
db.users.insert(doc); // Will fail since it already exists
_
これにより、すぐに複製が停止します。特定の条件下でのマルチスレッドセーフインサートについては、その場合の条件について詳しく知る必要があります。
ただし、__id
_インデックスはデフォルトで一意であることを追加する必要があります。
Theonソリューションは私にとってはうまくいきませんでしたが、これはうまくいきました:
BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);
pymongoを使用すると、次のようになります。
mycol.create_index("id", unique=True)
myColはDB内のコレクションです
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mycol.create_index("id", unique=True)
mydict = {"name": "xoce", "address": "Highway to hell 666", "id": 1}
x = mycol.insert_one(mydict)