如何在mongodb中创建树状复合索引

时间:2013-08-13 06:45:37

标签: mongodb mongoose

我是索引的新手。请阅读docs

如何创建如下的复合索引。我想在状态名称上创建一个索引,在该索引中,我想根据该状态的总体创建一个索引。

                 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如何对文档进行bucketizes /索引 基于人口。
  2. 如何自定义该格式化? (如上所示 图。)

2 个答案:

答案 0 :(得分:2)

您无法控制MongoDB如何存储其索引。可能你不需要。关于pop字段的简单索引可能已经足够了。

但是当你真的想通过利用你只查询三个范围的事实来尝试获得一些额外的性能时,你可以为每个文件添加另一个字段sizeCategory,其值为{ {1}}当pop为&lt; 2000时,1当pop为2000到5000或2时pop为大于5000.在该字段和查询上创建一个非唯一索引为了它。

答案 1 :(得分:1)

你只是指一个状态复合索引,pop?然后这很好用:

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-trees视为足够好,并且添加特定字段以存储“存储桶编号”的解决方案不太可能提高性能。