Java Mongodb避免重复条目
我是mongodb的新手。请告诉我如何避免重复输入。在关系表中,我们使用主键来避免它。我可以知道如何使用java在Mongodb中指定它吗?我不是java程序员,但是您可能可以转换它 默认情况下,MongoDB有一个名为Java Mongodb避免重复条目,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我是mongodb的新手。请告诉我如何避免重复输入。在关系表中,我们使用主键来避免它。我可以知道如何使用java在Mongodb中指定它吗?我不是java程序员,但是您可能可以转换它 默认情况下,MongoDB有一个名为\u id的主键。您可以在此键上使用upsert()或save(),以防止文档像这样被写入两次: var doc = {'name': 'sam'}; db.users.insert(doc); // doc will get an _id assigned to it db.u
\u id
的主键。您可以在此键上使用upsert()
或save()
,以防止文档像这样被写入两次:
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
这将立即停止复制。对于特定条件下的多线程安全插入:那么,我们需要更多地了解您在这种情况下的情况
但是,我应该补充一点,
\u id
索引默认为unqiue。使用带有{unique:true}
选项的索引
// everyone's username must be unique:
db.users.createIndex({email:1},{unique:true});
您还可以跨多个字段执行此操作。有关更多详细信息和示例,请参见文档中的
唯一索引确保索引字段不存储重复值;i、 e.强制索引字段的唯一性。默认情况下,MongoDB在创建集合期间在_id字段上创建唯一索引
如果希望从唯一键忽略null
值,则还必须通过添加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驱动程序创建索引。尝试:
Document keys = new Document("email", 1);
collection.createIndex(keys, new IndexOptions().unique(true));
Theon解决方案对我不起作用,但这一个确实起了作用:
BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);
BasicDBObject查询=新的BasicDBObject(,1);
collection.ensureIndex(查询,true);
这可以使用“\u id”字段来完成,但不鼓励使用此字段。
假设您希望名称是唯一的,那么您可以将名称放在“\u id”列中,您可能知道“\u id”列对于每个条目都是唯一的
BasicDBObject bdbo = new BasicDBObject("_id","amit");
现在,集合中没有其他条目可以名称为“amit”。这可能是您要求的方式之一。对于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"));
}
}
mycol.create_index("id", unique=True)
public void createUniqueIndex(){
文件索引=新文件(“字段名”,1);
MongoCollection collection=client.getDatabase(“dbName”).getCollection(“CollectionName”);
createIndex(index,newindexoptions().unique(true));
}
//并进行测试以验证其是否按预期工作
@试验
公共无效测试索引(){
MongoCollection collection=client.getDatabase(“dbName”).getCollection(“CollectionName”);
文档newDoc=新文档(“字段名”、“重复值”);
集合。insertOne(newDoc);
//这将抛出MongoWriteException
试一试{
集合。insertOne(newDoc);
失败(“由于密钥重复,应引发mongo写入异常”);
}捕获(Mongowrite例外){
assertTrue(例如getMessage()包含(“重复键”);
}
}
使用pymongo看起来像:
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"));
}
}
mycol.create_index("id", unique=True)
其中myCol是数据库中的集合
#!/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)
注意:
null
和none existant也算作唯一值,因此,如果您有一个用户表,其中有些用户已被删除,并且根据法律,您删除了他们的数据,但保留了他们的行以备将来删除,那么唯一索引将出现问题。我想这是真的需要了。@Sammaye:你可以用它来解决空字段/缺少字段的问题。+1这里的文档中提到过,唯一索引的最后一段:@Stennie Fair,我一定错过了addition@Jinesh谢谢更新答案。