Java 使用MongoDb创建索引

Java 使用MongoDb创建索引,java,mongodb,indexing,Java,Mongodb,Indexing,我是MongoDB的初学者,我正在尝试一些东西。 我想存储URL,为了避免重复的URL,我在URL上创建了一个唯一的索引。 那样 collection.createIndex(new BasicDBObject("url", type).append("unique", true)); 但是每次我启动我的程序,索引都会被重新创建,不是吗 因为,现在我的程序只插入一个url“http://site.com“如果我重新启动我的程序,这个url将再次插入,就像没有索引一样 每次创建索引都是处理索引的

我是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}
谢谢

编辑:

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

导入com.mongodb.BasicDBObject; 导入com.mongodb.DB; 导入com.mongodb.DBCollection; 导入com.mongodb.DBObject; 导入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<String> colls = db.getCollectionNames();

        for (String s : colls) {
            System.out.println(s);
        }
    }

    public void listIndex(){
         List<DBObject> 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));
    }


}

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

您需要将唯一值作为布尔值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 }

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

ensureIndex(新的BasicDBObject(“url”,1),“unq_url”,true))


我还看到,您没有在getCollection()中指定集合名称


那会选择什么样的收藏?好奇的

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

db.collection.ensureIndex(keys, options)
自版本3.0.0以来已弃用:db.collection.ensureIndex()现在是 db.collection.createIndex()的别名

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


我尝试使用
collection.ensureIndex(新的BasicDBObject(“url”),1.append(“unique”,true))但这是同样的问题。事实上,我的问题是,我在url上有一个唯一的索引,但是如果我多次插入同一url,那么我会有很多记录,而不仅仅是一条记录。我已经用true作为boolean进行了测试,但这是同一个问题。用当前代码更新你的问题,这一定很微妙。是的,也许,我刚刚添加了我的2个类。你没有按照我的建议更改代码。选项,如unique,必须作为第二个参数(或第三个)传递:更多信息不使用。作为关键参数的一部分追加。Oups,我没有看到区别。现在是工作了,谢谢;)NM,我看到您使用setCollection()抱歉
db.collection.ensureIndex(keys, options)