0

我是索引新手。只需阅读文档

如何创建如下所示的复合索引。我想在州名上创建一个索引,在该索引内,我想根据该州的人口创建一个索引。

                 state wise index
                       |
 ----------------------------------------------------
 |                    |                              |
pop<2000    pop>2000 & pop<5000    pop>5000 & pop<10000

为@Derick 更新的问题:

这是我的模拟数据。

    {"pop" : 1000,"state" : "AL"}
    {"pop" : 1500,"state" : "AL"}

    {"pop" : 2500,"state" : "AL"}
    {"pop" : 3000,"state" : "AL"}

    {"pop" : 6000,"state" : "AL"}
    {"pop" : 8000,"state" : "CA"}

然后,

db.simplezips.createIndex({state:1, pop:1});
db.simpezips.find({state:"AL", pop:{$gte:2500}}).explain(); 

给出如下日志。这符合我的预期。

    "n" : 3,
    "nscannedObjects" : 3,
    "nscanned" : 3,
    "nscannedObjectsAllPlans" : 3,
    "nscannedAllPlans" : 3,

问题:

  1. 我想知道的是,mongodb如何根据人口对文档进行分桶/索引。
  2. 我如何自定义该分桶?(如上图所示。)
4

2 回答 2

2

您无法控制 MongoDB 如何存储其索引。而且很可能你不需要。pop 字段上的简单索引可能就足够了。

但是,当您真的想通过利用您只有三个要查询的范围这一事实来尝试获得一些额外的性能时,您可以sizeCategory向每个文档添加另一个字段,该字段的值是1当 pop 小于 2000 时,2当pop 介于 2000 和 5000 之间,或者3当 pop 大于 5000 时。在该字段上创建一个非唯一索引并对其进行查询。

于 2013-08-13T21:17:36.790 回答
1

你的意思是关于状态的复合索引,流行音乐?然后这工作得很好:

db.collection.ensureIndex( { state: 1, pop: 1 } );

此索引可用于以下查询组:

  • find( { state: "TX", pop: { $lt : 2000 } } )
  • find( { state: "TX", pop: { $gte: 2000, $lt: 5000 } } )
  • find( { state: "TX" } ).sort( { pop: 1 } );
  • find( { state: "TX", pop: { $gte: 2000, $lt: 5000 } } ).sort( { pop: -1 } )

MongoDB 不使用“桶”作为索引,而是使用适用于范围查询的 b 树。您无法控制此机制,但您也不必控制,因为 b-tree 已经足够好,并且添加特定字段来存储“桶号”的解决方案不太可能提高性能。

于 2013-08-13T09:27:38.153 回答