使用java在mongodb中创建一个包含多个字段的索引

时间:2014-09-10 05:42:11

标签: java mongodb indexing mongodb-indexes

我是MongoDB的新手。默认情况下,mongodb中的集合在_id字段上有索引。我需要使用Java在另外2个字段上创建索引。

DBObject indexOptions = new BasicDBObject();
indexOptions.put(field_1, 1);
indexOptions.put(field_2, -1);
collection.createIndex(indexOptions )

当我使用db.collection_name.getIndexes()

在mongodb中查询时
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "schema.collection_name"
        },
        {
                "v" : 1,
                "key" : {
                        "field_1" : 1,
                        "field_2" : -1
                },
                "name" : "field_1_1_field_2_-1",
                "ns" : "schema.collection_name"
        }
]

我不确定上述内容是否正确。 有人可以确认吗?如果不正确,我该如何纠正呢?

除此之外,为了检索我正在做这样的事情:

        DBObject subscriberIdObj = new BasicDBObject( field3, value3 );
        DBObject subscriberIdIsNullObj = new BasicDBObject( field3, null );
        BasicDBList firstOrValues = new BasicDBList();
        firstOrValues.add( subscriberIdObj );
        firstOrValues.add( subscriberIdIsNullObj );
        DBObject firstOr = new BasicDBObject( "$or", firstOrValues );

        DBObject batchIdObj = new BasicDBObject( field1, value1 );
        DBObject fileNameObj = new BasicDBObject( field2, value2 );
        BasicDBList secondOrValues = new BasicDBList();
        secondOrValues.add( batchIdObj );
        secondOrValues.add( fileNameObj );
        DBObject secondOr = new BasicDBObject( "$or", secondOrValues );
        BasicDBList andValues = new BasicDBList();
        andValues.add( firstOr );
        andValues.add( secondOr );

        DBObject query = new BasicDBObject( "$and", andValues );
        DBCursor cursor = mongoDatastore.getDB().getCollection(collection_name).find(query);

现在,为了快速检索,我应该在field1,field2和field3上单独创建索引吗?所有3个字段的复合索引?

1 个答案:

答案 0 :(得分:4)

这是正确的,称为Compound Index。您已在两个字段上创建了索引:field_1(升序)和field_2(降序)。例如,如果您按field_1升序和field_2降序或field_1降序和field_2升序排序,MongoDb将使用此索引field_1_1_field_2_-1

但是,上述索引不支持按升序field_1值排序,然后升序field_2值。此外,如果您仅在field_2上搜索或排序,则不会使用此索引。在这种情况下,您可以为field_1field_2创建单独的索引。

要检查您的查询是否使用索引,请尝试使用explain()并查看使用的是哪个游标。例如,您可以尝试这样的查询:

db.your_collection.find({ "field_1" : "something" }).explain()

如果您将看到使用的光标是BtreeCursor,那么查询将使用索引,如果BasicCursor则没有。

有关详细信息,请参阅this article