首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nearSphere是否使用带有遗留坐标对的2dsphere索引?

nearSphere是否使用带有遗留坐标对的2dsphere索引?
EN

Stack Overflow用户
提问于 2019-07-11 00:07:11
回答 1查看 227关注 0票数 0

mongodb查询使用一个location字段和多个其他字段:

代码语言:javascript
复制
{
    "location": {
        "$nearSphere": ["<val>"],
        "$maxDistance": "<val>"
    },
    "userId": {
        "$nin": ["<vals>"]
    },
    "date": {
        "$gte": "<val>"
    },    
    "age": {
        "$in": ["<vals>"]
    },
    "property1": {
        "$in": ["<vals>"]
    },
    "weight": {
        "$in": ["<vals>"]
    }
}

location字段使用遗留坐标对

创建2dsphere索引是为了使用多个字段。

与可以引用一个位置字段和另一个字段的复合2d索引不同,复合2dsphere索引可以引用多个位置字段和非位置字段。

代码语言:javascript
复制
{
    "count": 1,
    "height": 1,
    "weight": 1,
    "age": 1,
    "date": -1,
    "location": "2dsphere",
    "userId": 1
}

文档说:

$nearSphere需要一个地理空间索引:

  • 定义为GeoJSON点的位置数据的2dsphere索引
  • 定义为遗留坐标对的位置数据的2d索引。若要对GeoJSON点使用2d索引,请在GeoJSON对象的坐标字段上创建索引。

这里

具有2dsphere索引的字段必须以坐标对或GeoJSON数据的形式保存几何数据。

( 1)索引是否会被使用?从文档中我了解到,2dsphere索引要求位置数据是GeoJSON对象,而不是遗留坐标对。另一方面,还可以从遗留的坐标对构建2dsphere索引。

( 2)能否优化索引(或查询)?

EN

回答 1

Stack Overflow用户

发布于 2019-07-11 02:59:01

我建议您查看/使用$geoWithin而不是$nearSphere (如果您的usecase匹配的话)。$nearsphere排序的结果是从中心点开始增加距离,而$within没有。如果在您的情况下不需要根据距离进行排序,或者您正在对任何其他字段进行排序,那么使用$nearsphere是没有意义的。

对于$geoWithin,2dsphere索引也不是强制性的,尽管性能是必需的。因此,如果在您的查询中,如果其他匹配条件留下一组非常小的结果供筛选出以进行位置匹配,则在location字段上根本不需要索引。我的观点是,只在那些具有很高基数的字段上创建一个索引,在复合索引中添加所有字段是没有意义的。目前,复合索引中有7个字段。

1)使用mongo解释查询检查索引是否被使用(并在这里共享执行计划)。2dsphere索引支持存储为GeoJSON对象和遗留坐标对的数据。对于遗留坐标对,索引将数据转换为GeoJSON点。

2)对于索引优化,从基数较低的索引中删除字段。复合索引中字段的顺序很重要,所以根据相同的事实对它们进行排序。我不认为(不能评论太多,因为我不知道用例),在查询中有任何改进的余地。另外,您可以从索引中删除userId,$nin对复合索引没有那么好的效果。

基数:集合的元素数。例如:一个字段“性别”只能有两个字段"M“和"F",因此基数很低。而"Mobile“字段的数字非常明显,因此基数很高。如果在复合索引中使用2dsphere索引,则首先使用它。

用最多三个字段尝试不同的复合索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56980078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档