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

12

我想通过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);
    }

但它只创建了一个索引而不是复合索引,并给我返回以下结果:

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

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

3个回答

27

如果你看看你的代码,实际上你调用了 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");

6
在StackOverflow上,如果您将答案标记为正确并/或投票支持它,我将获得积分。这还会告诉其他人这是正确的答案。您能做到这一点吗? - Gates VP
1
为什么不@Gates!抱歉,我可能之前做过了,但我是这个网站的新手 :) - jad001

5
你可以根据官方文档尝试这个。
import org.bson.Document;
db.getCollection("restaurants").createIndex(new Document("cuisine", 1).append("address.zipcode", -1));

官方Mongo DB Java驱动文档


4
一种更现代和流畅的方法可能是:
import com.mongodb.client.model.Indexes;

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

手册中发现。已经过格式化以便阅读,您可以根据自己的喜好调整格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接