嵌入式数组上的Mongo索引和使用$ lt和$ gt的查询

时间:2015-02-27 16:54:13

标签: mongodb indexing

我有一个包含以下文档的集合:

{'data': [{'Depth': 0.0, 'Value': 123.0},
          {'Depth': 0.5, 'Value': 456.0},
          {'Depth': 1.0, 'Value': 111.0},
          {'Depth': 1.5, 'Value': 321.0},
          {'Depth': 2.0, 'Value': 987.0},
          {'Depth': 2.5, 'Value': 666.0},
          ...
          {'Depth': 3.0, 'Value': 453.0}],
 'datatype': 'Sometype'

}

我想执行如下所示的查询:

curves = db.curvedata.findOne(
 {
  "datatype" : "Sometype",
  "data": {
   "$elemMatch": {
    "Depth" : { "$gt": 13000, "$lt": 13100 },
    "Value" : { "$gt": 20, "$lt": 100 } }}})

即找到深度范围和值范围内的所有曲线。

问题是 - 我可以索引所有数据值,以便上述查询超快吗?如果是这样,$lt$gt运算符会使用索引吗?

3 个答案:

答案 0 :(得分:2)

创建一个索引

.ensureIndex({'data.Depth':1,'data.Value':1})

答案 1 :(得分:1)

查询只使用1个索引。 但是,您可以创建一个多键索引:

.ensureIndex({Depth:1,Value:1})

然后,使用.explain()确保查询使用您刚刚创建的索引。

答案 2 :(得分:1)

你确定可以!你正在寻找的是一个多键索引。您可以通过执行类似

的操作来创建它
db.curvedata.ensureIndex({"data.depth": 1})

然后你可以用同样的方式查询。您可以在两个查询上运行.explain(),以查找您在保存,预先和发布索引之前需要多长时间。