问题描述
{
"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
排序。为了使这些查询更快,我创建了一个复合索引:isLive
、vehicleCondition
、vehicleDetails.location
(2dsphere 类型)、searchPriority
和 dateOfGoingLive
。
当我执行这个 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 索引对这个查询有帮助吗?如何更快地进行这些查询?
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 (将#修改为@)