如何解释 mongo Explain 的结果并改进地理空间查询?

问题描述

我在 MongoDB 中有一个集合,其中文档的结构如下:

{
    "vechicleDetails": {
        "location": {
            "type": "Point","coordinate": [78.00,-40] //longitude,latitude
        },"city": "New Delhi"
    },"searchPriority": 4,"isLive": true,"vehicleCondition": "USED","dateOfGoingLive": ISODate()
}

还有很多其他字段,但我省略了它们,因为它们与这个问题无关。

我有一个查询将在此集合上非常频繁地执行:

db.vehicleinventories_latlong.find({ $query: {isLive: false,vehicleCondition: "USED","vehicleDetails.city": {$in: ["New Delhi","Delhi","Gurugram"]},"vehicleDetails.location": { $nearSphere: { $geometry: { type: "Point",coordinates: [ 77.2,28.6 ] },$maxdistance: 100 * 1000 } }},$orderby: {searchPriority: -1,dateOfGoingLive: -1} })

通过这个查询,我试图获取满足以下条件的所有文档:

  • isLive:假
  • 车辆状况:“使用”
  • vehicleDetails.city 是以下值之一:新德里、德里、古尔格拉姆、
  • vehicleDetails.location 位于 [ 77.2,28.6 ] 半径 100 公里内(经度、纬度按此顺序)

我希望结果首先按距 [77.2,28.6] 的距离排序,然后按 searchPriority 排序,然后按 dateOfGoingLive 排序。为了使这些查询更快,我创建了一个复合索引:isLivevehicleConditionvehicleDetails.location(2dsphere 类型)、searchPrioritydateOfGoingLive

当我执行这个 explain 命令时:

db.vehicleinventories_latlong.find({ $query: {isLive: false,dateOfGoingLive: -1} }).explain()

这只是上一个.explain() 结尾的查询命令。 这是我在 MongoShell 上得到的输出

https://pastebin.com/qEvUNju0 (i have removed some parts of the output because it did not fit the 512K limit for pastebin)

它很长,我不知道如何解释这些结果。我可以看到正在使用索引,但为什么我看到这么多 vehicleDetails.location 元组数组?我的集合中目前只有 360 个文档,并且只有 15 个文档满足此查询的条件。我是否为此查询正确索引了集合?

查询将响应网络请求而执行,该请求将询问“来自以下城市的所有已使用、已使用的车辆:新德里、德里和古尔格拉姆,首先按距新德里的距离排序,然后按搜索优先级排序,然后按出发日期排序居住”。我在查询中的 $in 子句中列出城市名称的顺序是相关的。距离必须从 $in 子句中的第一个城市开始测量。这意味着查询中的 $nearsphere 子句将包含 $in 数组中第一个城市的坐标。

在集合中,vehicleDetails.location 坐标对于属于同一城市的所有车辆都是相同的,并且我的数据库中的城市数量非常少。有了这些细节,你认为 2dsphere 索引对这个查询有帮助吗?如何更快地进行这些查询

编辑:添加了 getIndexKeys() 的输出

db.vehicleinventories_latlong.getIndexKeys()
[ { _id: 1 },{ isLive: 1,vehicleCondition: 1,'vehicleDetails.location': '2dsphere' },'vehicleDetails.location': '2dsphere',searchPriority: 1 },searchPriority: 1,dateOfGoingLive: 1 },'vehicleDetails.city': 1,searchPriority: -1,dateOfGoingLive: -1 } ]

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)