gpt4 book ai didi

mongodb - 在不使用 $maxDistance 的情况下,MongoDB 中 $near 的问题

转载 作者:可可西里 更新时间:2023-11-01 09:14:53 27 4
gpt4 key购买 nike

目前我们在 MongoDB 3.2.9 中的 $near 操作上遇到了很大的麻烦。

问题是在创建游标时存在无限负载 - 直到超时。这个问题只会在我们不使用 $maxDistance 时出现——在我们的例子中,不要使用它很重要。

这是我们的收藏:

地点

大约 2.000.000 个具有 GeoJSON 属性“geometry”的文档也已编入索引。

除了几何之外,还有另一个名为“类别”的索引。

在我们的特殊情况下,我们的查询现在看起来像这样:

Locations.find({
category: 'ABC',
geometry: {
'$near': {
$geometry: {
type: "Point" ,
coordinates: [ 13.357315063476564, 52.53167855932515 ]
}
}
}
}, {
limit: 10
});

此查询将导致超时

要解决这个问题,我们需要添加 $maxDistance 操作,它会正常工作(如果 $maxDistance 的值不太高)但在我们的例子中是 $maxDistance 非常糟糕,因为 1 个位置与另一个位置之间的距离是否很远并不重要。例如,当第一个找到的位置在挪威,第二个在澳大利亚的某个地方时,这没问题。

其他信息:

这个问题只是在LESS时导致结果限制。在我们上面的示例中,我们的数据库中有 8 个具有此类别的位置。如果我们对 10 多个位置执行相同的查询,则大约需要几毫秒。

总结一下:

// Does not work. Ends up in an timeout
Locations.find({
category: 'ABC', // has 9 locations
geometry: {
'$near': {
$geometry: {
type: "Point" ,
coordinates: [ 13.357315063476564, 52.53167855932515 ]
}
}
}
}, {
limit: 10
});

// Works fine because of the $maxDistance - but in our case a $maxDistance is very BAD and needed to be prevented!
Locations.find({
category: 'ABC', // has 9 locations
geometry: {
'$near': {
$geometry: {
type: "Point" ,
coordinates: [ 13.357315063476564, 52.53167855932515 ]
}
},
'$maxDistance': 5000 // If this value is too high - like the maxDistance is "the whole world" the query would also end up in an timeout
}
}, {
limit: 10
});

// Works fine because >= 10 items
Locations.find({
category: 'DEF', // has 10 locations
geometry: {
'$near': {
$geometry: {
type: "Point" ,
coordinates: [ 13.357315063476564, 52.53167855932515 ]
}
}
}
}, {
limit: 10
});

我们正在使用 MongoDB 3.2.9

附加信息

这个问题与我们在nodeJS中使用MongoDB无关。我们也在使用 RoboMongo,当执行这个查询时,同样的问题会导致:超时!

最佳答案

我创建了一个包含 200 万个随机数据文档的集合,为 categorygeometry 字段准备了索引。当我继续测试这个集合时,我遇到了和你一样的问题。

没有 $maxDistance 值大约需要 50 秒。起初这似乎是合理的,因为没有 $maxDistance Mongo 必须在“全世界”搜索结果。但后来我检查了 .explain()查询结果并意识到它根本没有使用索引,没有阶段 IXSCAN (这是旧版本 Mongo 中的 BasicCursor)在查询中。所以问题很明显,我错误地创建了索引,你也是。

您(我也是)创建的索引是 Single Field Indexes这仅在按单个字段搜索时有帮助。在本例中,您按两个字段进行搜索,因此需要使用 Compound Indexes .使用此命令创建可用于搜索的复合索引:

db.collection({category: 1, geometry: '2dsphere'});

我这样做了,结果很惊人,时间从 50 秒减少到几百毫秒。

关于mongodb - 在不使用 $maxDistance 的情况下,MongoDB 中 $near 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40806352/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com