3

我是新手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 个字段的复合索引?

4

1 回答 1

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_1在这种情况下,您可以为和创建单独的索引field_2

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

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

如果您会看到使用的游标是BtreeCursor,则查询使用索引,以防BasicCursor不使用。

有关更多信息,请参阅这篇文章

于 2014-09-10T05:50:22.570 回答