gpt4 book ai didi

mongodb - 首先使用简单键的地理空间索引

转载 作者:可可西里 更新时间:2023-11-01 09:46:45 24 4
gpt4 key购买 nike

阅读有关 MongoDB 和 Geospatial Indexing 的信息后

我很惊讶它不支持不以 2d 索引开头的复合键。

我不知道我是否会从中获益,但现在 mssql 解决方案同样慢/快。

SELECT TOP 30 * FROM Villages WHERE SID = 10 ORDER BY (math to calc radius from the center point)

这行得通,但速度很慢,因为它不够智能,无法使用索引,因此它必须计算具有该 SID 的所有村庄的半径。

所以在 Mongo 中我想创建一个像这样的索引:{sid: 1, loc: "2d"} 这样我就可以从一开始就过滤掉很多。

我不确定是否有任何解决方案。我考虑过为每个 sid 创建一个集合,因为它们不共享任何信息。但是这样做有什么缺点呢?还是人们就是这样做的?

更新

map 是平面的:800、800到-800、-800,村庄是从 map 中心向外的地方。大约有 300 个不相关的不同 map ,因此它们可能在差异集合中,但不确定开销。

如果需要更多信息,请告诉我。

我尝试过的

> var res = db.Villages.find({sid: 464})
> db.Villages.find({loc: {$near: [50, 50]}, sid: {$in: res}})
error: { "$err" : "invalid query", "code" : 12580 }
>

也试过这个

db.Villages.find({loc: {$near: [50, 50]}, sid: {$in: db.Villages.find({sid: 464}, {sid: 1})}})
error: { "$err" : "invalid query", "code" : 12580 }

我不太确定我做错了什么,但可能与语法有关。在这里很困惑。

最佳答案

如您所述,Mongodb 不能接受位置作为地理索引中的辅助键。 2d 必须在索引中排在第一位。因此,您在这里更改索引模式并不走运。

但是有一个解决方法,您可以在 sid 上创建两个单独的索引,并使用 loc 和 sid 创建一个复合索引,而不是复合地理索引

  db.your_collection.ensureIndex({sid : 1})
db.your_collection.ensureIndex({loc : '2d',sid:1})

或 sid 和 loc 上的两个独立索引

  db.your_collection.ensureIndex({sid : 1})
db.your_collection.ensureIndex({loc : '2d'})

(我不确定上面哪个有效,你可以自己试试)

您可以进行两个不同的查询,以首先按 sid 过滤结果,然后按位置过滤,有点像这样

  res = db.your_collection.find({sid:10})
//get all the ids from the res (res_ids)
//and query by location using the ids
db.your_collection.find({loc:{ $near : [50,50] } ,sid : {$in : res_ids}})

关于mongodb - 首先使用简单键的地理空间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986027/

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