MongoDB Scala驱动程序是否与JavaScript接口中的explain()函数等效?

时间:2016-04-13 16:20:28

标签: mongodb scala

MongoDB Scala驱动程序是否与JavaScript接口中的explain()函数等效?

我想知道MongoDB Scala驱动程序对这样的查询做了什么:

collection.find(
  and(geoWithinBox("geometry", bbox.swLon, bbox.swLat, bbox.neLon, bbox.neLat),
    equal("properties.foo", "abc"),
    exists("properties.bar")))
  .limit(100)

MongoDB似乎没有使用我创建的地理空间索引,我试图找出原因。相反,它似乎是扫描每个文件。至少我在MongoShell中使用此JS查询尝试explain时注意到了这一点:

{$and: [{"geometry": {$geoWithin: {$box: [ [-78,40],[-76,41] ] }}},
        {$and: [{"properties.foo": {$eq: "abc"}},
                {"properties.bar": {$exists: 1}}
               ]
        }
       ]
}

(我在上面的JS的第一个版本中没有嵌套 - and。我只是尝试不同的东西来看看它们是否触发了地理空间索引的使用。)

1 个答案:

答案 0 :(得分:1)

此答案基于当前的MongoDB Scala驱动程序v1.1.0和当前MongoDB v3.2

目前没有通过Scala驱动程序的游标explain()函数。这是因为explain已被确定为不是驾驶员的正常用例。我建议使用Mongo Shell来调试查询索引用法。有关详细信息,请参阅MongoDB driver spec

但是,您仍然可以使用runCommand来获取解释输出。例如,Mongo Shell中的$geoWithin查询:

db.collection.find({
    "geometries":{
        $geoWithin:{
            $box:[[-78,40], [-76, 41]]
        }
    }
}).explain()

您可以使用Scala中的命令执行相同的操作,如下所示:

val command = Document("explain" -> Document("find"->"collection", 
                        "filter"->Document("geometries"->Document(
                                "$geoWithin"->Document(
                                     "$box"->Seq(Seq(-78, 40), Seq(-76, 41))
                                  )
                            )
                        )
                    )
               )
val observable = db.runCommand(command).printHeadResult()

或者用于汇总查询

  db.runCommand(
    Document(
      "aggregate" -> "collection",
      "pipeline" -> List[Document]( ... ),
      "explain" -> true
    )
  )

值得一提的是,只有2d地理空间索引支持$box运算符。确保您拥有字段geometries的正确索引。

此外,默认情况下,查询是使用AND隐式构建的,因此您不必明确指定$and。您的示例可缩短为:

db.collection.find({"geometry": {$geoWithin: {$box: [[-78,40],[-76,41]] }},
                    "properties.foo" : "abc", 
                    "properties.bar": {$exists:true}
                   })