使用MongoDb创建索引

我是MongoDB的初学者,我正在尝试一些东西。 我想存储URL并避免重复的URL我在url上创建了一个唯一的索引。 像那样

collection.createIndex(new BasicDBObject("url", type).append("unique", true)); 

但每次我启动我的程序时,索引再次创建不是吗?

因为,现在我的程序只插入一个URL“http://site.com”,如果我重新启动我的程序,这个url会再次插入,就像没有索引一样。

每次创建索引是处理索引的错误方法吗?

这是我的代码示例

 mongo.getCollection().ensureIndex(new BasicDBObject("url", 1).append("unique", "true")); mongo.getCollection().insert(new BasicDBObject("url", "http://site.com").append("crawled", 0)); mongo.getCollection().insert(new BasicDBObject("url", "http://site.com").append("crawled", 0)); 

并输出:

 { "_id" : { "$oid" : "50d627cf44ae5d6b5e9cf106"} , "url" : "http://site.com" , "crawled" : 0} { "_id" : { "$oid" : "50d627cf44ae5d6b5e9cf107"} , "url" : "http://site.com" , "crawled" : 0} 

谢谢

编辑:

这是我的类Mongo,它处理MongoDB导入java.net.UnknownHostException; import java.util.List; import java.util.Set;

import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.MongoClient;

 public class Mongo { private MongoClient mongoClient; private DB db; private DBCollection collection; private String db_name; public Mongo(String db){ try { mongoClient = new MongoClient( "localhost" , 27017 ); this.db = mongoClient.getDB(db); this.db_name = db; } catch (UnknownHostException e) { e.printStackTrace(); } } public void drop(){ mongoClient.dropDatabase(db_name); } public void listCollections(){ Set colls = db.getCollectionNames(); for (String s : colls) { System.out.println(s); } } public void listIndex(){ List list = collection.getIndexInfo(); for (DBObject o : list) { System.out.println("\t" + o); } } public void setCollection(String col){ this.collection = db.getCollection(col); } public void insert(BasicDBObject doc){ this.collection.insert(doc); } public DBCollection getCollection(){ return collection; } public void createIndex(String on, int type){ collection.ensureIndex(new BasicDBObject(on, type).append("unique", true)); } } 

这是我的class级来处理我的程序

 public class Explorer { private final static boolean DEBUG = false; private final static boolean RESET = false; private Mongo mongo; private String host; public Explorer(String url){ mongo = new Mongo("explorer"); mongo.setCollection("page"); if (RESET){ mongo.drop(); System.out.println("Set RESET to FALSE and restart the program."); System.exit(1); } if (DEBUG) { mongo.listCollections(); } this.host = url.toLowerCase(); BasicDBObject doc = new BasicDBObject("url", "http://site.com").append("crawled", 0); mongo.getCollection().ensureIndex(new BasicDBObject("url", 1).append("unique", true)); mongo.getCollection().insert(new BasicDBObject("url", "http://site.com").append("crawled", 0)); mongo.getCollection().insert(new BasicDBObject("url", "http://site.com").append("crawled", 0)); process(); } private void process(){ BasicDBObject query = new BasicDBObject("crawled", 0); DBCursor cursor = mongo.getCollection().find(query); try { while(cursor.hasNext()) { System.out.println(cursor.next()); } } finally { cursor.close(); } } } 

您需要将唯一值作为布尔值true传递,而不是作为字符串传递,并且它是选项的第二个参数:

 ...ensureIndex(new BasicDBObject("url", 1), new BasicDBObject("unique", true)); 

另外,我使用mongo解释器手动测试它:

 > db.createCollection("sa") { "ok" : 1 } > db.sa.ensureIndex({"url":1},{unique:true}) > db.sa.insert({url:"http://www.example.com", crawled: true}) > db.sa.insert({url:"http://www.example.com", crawled: true}) E11000 duplicate key error index: test.sa.$url_1 dup key: { : "http://www.example.com" } > db.sa.insert({url:"http://www.example2.com/", crawled: false}) > db.sa.insert({url:"http://www.example.com", crawled: false}) E11000 duplicate key error index: test.sa.$url_1 dup key: { : "http://www.example.com" } > 

只有两个对象:

 > db.sa.find() { "_id" : ObjectId("50d636baa050939da1e4c53b"), "url" : "http://www.example.com", "crawled" : true } { "_id" : ObjectId("50d636dba050939da1e4c53d"), "url" : "http://www.example2.com/", "crawled" : false } 

我不完全理解你的问题,但我觉得你很可能应该使用ensureIndex而不是createIndex因为后者总是试图创建索引,而前者只会确保它存在。

只是偶然发现了这个问题,自版本3.0.0以来有一些变化

 db.collection.ensureIndex(keys, options) 

从3.0.0版开始不推荐使用:db.collection.ensureIndex()现在是db.collection.createIndex()的别名。

如果索引尚不存在,则在指定字段上创建索引。

要使用mongodb的唯一索引,您应该使用带有2个参数的方法,其中第3个布尔参数用于“唯一”索引。

mongo.getCollection()。ensureIndex(new BasicDBObject(“url”,1),“unq_url”,true));

另外我看到你没有在getCollection()中指定的集合名称;

选择哪个系列? 好奇