web-dev-qa-db-ja.com

Mongodbは重複エントリを避けます

私はmongodbの初心者です。エントリの重複を避ける方法を教えてください。リレーショナルテーブルでは、それを避けるために主キーを使用します。 javaを使用してMongodbで指定する方法を知っていますか?

26
Jessie

{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));
41
theon

これは「_id」フィールドを使用して実行できますが、この使用は推奨されません。名前を一意にする場合、「_ id」列に名前を入力できます。ご存知のとおり、「_ id」列は各エントリで一意です。

BasicDBObject bdbo = new BasicDBObject("_id","amit");

これで、コレクション内の「amit」という名前を持つエントリは他にありません。これは、あなたが求めている方法の1つです。

1
Amit Chahar

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"));
    }
}
1
Cuga

私は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_インデックスはデフォルトで一意であることを追加する必要があります。

0
Sammaye

Theonソリューションは私にとってはうまくいきませんでしたが、これはうまくいきました:

BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);
0
hithwen

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)