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
。我只是尝试不同的东西来看看它们是否触发了地理空间索引的使用。)
答案 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}
})