如何通过Java驱动程序在MongoDB中创建复合索引?

时间:2012-07-15 01:22:42

标签: java mongodb indexing mongodb-java

我想通过Java驱动程序在MongoDB中的AgeName创建复合索引,这是我的语法:

coll.ensureIndex(new BasicDBObject("Age", 1),new BasicDBObject("Name", -1));
List <DBObject> list = coll.getIndexInfo();

  for (DBObject o : list) {
       System.out.println(o);
    }

但是它只创建了1个索引而不是compund索引,并给出了结果:

{ "v" : 1 , "key" : { "_id" : 1} ,"ns" :"EmployeeData.EmpPersonalData", "name":"_id_"}
{ "v" : 1 , "key" : { "Age" : 1} , "ns" : "EmployeeData.EmpPersonalData" , "name" : "Age_1" , "Name" : -1}

那么如何通过java驱动程序创建集合上的compund索引?

2 个答案:

答案 0 :(得分:26)

如果查看代码,实际上已使用两个参数调用ensureIndex。你的第一个参数是关键,你的第二个参数变成了一些额外的字段:Name: -1

您希望在第一个参数中传递的是此对象{"Age":1, "Name":-1}。你实际传递的是{"Age":1}, {"Name":-1}

所以你想做这样的事情:

BasicDBObject obj = new BasicDBObject();
obj.put("Age", 1);
obj.put("Name", -1);
coll.ensureIndex(obj);

请注意,将使用默认名称创建索引。要提供特定名称,请执行以下操作:

coll.ensureIndex(obj, "MyName");

答案 1 :(得分:0)

更现代,也许更流畅的方法可能是:

import com.mongodb.client.model.Indexes;

collection
    .createIndex(
        Indexes.compoundIndex(
            Indexes.ascending("Age"),
            Indexes.descending("Name")
        )
    );

the manual中找到。格式清晰;后格式化以符合您自己的口味。