2012-08-30 50 views
23

Tôi là người mới đến mongodb. Tôi có thể biết cách tránh các mục trùng lặp không. Trong các bảng quan hệ, chúng ta sử dụng khóa chính để tránh nó. Tôi có thể biết làm thế nào để xác định nó trong Mongodb bằng cách sử dụng java?Mongodb tránh các mục trùng lặp

Trả lời

38

Sử dụng chỉ mục có tùy chọn {unique:true}.

// everyone's username must be unique: 
db.users.createIndex({email:1},{unique:true}); 

Bạn cũng có thể thực hiện việc này trên nhiều trường. Xem this section trong tài liệu để biết thêm chi tiết và ví dụ.

chỉ số MongoDB có thể tùy chọn áp đặt một độc đáo quan trọng hạn chế, mà đảm bảo rằng không có tài liệu được chèn vào các giá trị mà cho các phím được lập chỉ mục phù hợp với các tài liệu hiện có.

Nếu bạn muốn cho null giá trị để được bỏ qua từ khóa duy nhất, sau đó bạn có cũng làm cho chỉ mục thưa thớt (thấy here), bởi cũng thêm sparse tùy chọn:

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

Nếu bạn muốn tạo chỉ mục bằng Trình điều khiển Java MongoDB. Hãy thử:

Document keys = new Document("email", 1); 
collection.createIndex(keys, new IndexOptions().unique(true)); 
+0

Lưu ý: 'null' và không tồn tại nào cũng được tính là giá trị duy nhất, vì vậy nếu bạn có bảng người dùng bị xóa và theo luật, bạn xóa dữ liệu của họ nhưng giữ hàng của họ để xóa trong tương lai bạn sẽ có vấn đề với các chỉ mục duy nhất. Tôi đoán nó thực sự cần. – Sammaye

+2

@Sammaye: Bạn có thể sử dụng [chỉ mục thưa thớt] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-sparse%3Atrue) để giải quyết vấn đề với các trường trống/thiếu. – Stennie

+0

+1 Nó được đề cập trong tài liệu ở đây, đoạn cuối cho các chỉ mục duy nhất: http://docs.mongodb.org/manual/core/indexes/#unique-index – theon

0

Tôi không phải là lập trình viên Java, tuy nhiên bạn có thể chuyển đổi điều này.

MongoDB theo mặc định không có một khóa chính được gọi là _id bạn có thể sử dụng upsert() hoặc save() trên phím này để ngăn chặn các tài liệu không được viết bằng hai lần như vậy:

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 

này sẽ ngừng ngay lập tức trùng lặp. Như để chèn đa luồng an toàn trong điều kiện nhất định: tốt, chúng tôi sẽ cần phải biết thêm về tình trạng của bạn trong trường hợp đó.

Tôi nên thêm tuy nhiên chỉ số _id là không theo mặc định.

+0

Tại sao downvote? – Sammaye

+0

Typo, có vẻ như ... – Sammaye

0

giải pháp Theon không làm việc cho tôi, nhưng điều này đã làm:

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

Điều này có thể được thực hiện bằng trường "_id", mặc dù sử dụng này không được khuyến khích. giả sử bạn muốn tên là duy nhất, sau đó bạn có thể đặt tên trong cột "_id" và bạn có thể biết cột "_id" là duy nhất cho mỗi mục nhập.

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

Bây giờ, không có mục nhập khác có thể có tên là "amit" trong collection.This có thể là một trong những cách mà bạn đang yêu cầu.

1

Tính đến tài xế Java v3.0 Mongo của, mã để tạo ra các chỉ số trông giống như:

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")); 
    } 
} 
Các vấn đề liên quan