【问题标题】:Create an index in mongodb with more than one field using java使用java在mongodb中创建一个具有多个字段的索引
【发布时间】:2014-11-03 16:01:49
【问题描述】:

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

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

当我在 mongodb 中使用 db.collection_name.getIndexes() 查询时

[
        {
                "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 个字段的复合索引?

【问题讨论】:

  • 是的。你所做的是正确的。您已经创建了一个包含两个字段的复合索引。

标签: java mongodb indexing mongodb-indexes


【解决方案1】:

这是正确的,称为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

【讨论】:

  • 谢谢 Yuriy..我可能只想搜索 field_2,所以我需要为此创建一个单独的索引吗?你的意思是说这个索引只有在我搜索 field_1 和 field_2 组合(作为一个整体)时才有效?
  • 是的,如果你只需要搜索field_2,那么你需要一个单独的索引,但不要忘记写入会更慢。该索引适用于 field_1 和 field_2 的组合,但并非在所有情况下都有效,如果您仅按 field_1 搜索,它也应该有效。
  • 我读到索引会减慢插入速度。所以考虑到写入和读取操作的比例相同,我们是否应该使用索引?
  • 没错,一切都取决于您的数据库结构和您所做的查询:) 很多因素都取决于此。至少你可以看到你在做什么:如果读取 - 那么你肯定需要索引,如果写入 - 你需要考虑是否需要它们。
  • 如果您觉得这个答案有用,请接受它作为最佳答案。
猜你喜欢
  • 2015-11-19
  • 2012-09-16
  • 2016-06-19
  • 2016-01-18
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多