mongodb查询使用一个location字段和多个其他字段:
{
"location": {
"$nearSphere": ["<val>"],
"$maxDistance": "<val>"
},
"userId": {
"$nin": ["<vals>"]
},
"date": {
"$gte": "<val>"
},
"age": {
"$in": ["<vals>"]
},
"property1": {
"$in": ["<vals>"]
},
"weight": {
"$in": ["<vals>"]
}
}location字段使用遗留坐标对。
创建2dsphere索引是为了使用多个字段。
与可以引用一个位置字段和另一个字段的复合2d索引不同,复合2dsphere索引可以引用多个位置字段和非位置字段。
{
"count": 1,
"height": 1,
"weight": 1,
"age": 1,
"date": -1,
"location": "2dsphere",
"userId": 1
}文档说:
$nearSphere需要一个地理空间索引:
和这里
具有2dsphere索引的字段必须以坐标对或GeoJSON数据的形式保存几何数据。
( 1)索引是否会被使用?从文档中我了解到,2dsphere索引要求位置数据是GeoJSON对象,而不是遗留坐标对。另一方面,还可以从遗留的坐标对构建2dsphere索引。
( 2)能否优化索引(或查询)?
发布于 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索引,则首先使用它。
用最多三个字段尝试不同的复合索引。
https://stackoverflow.com/questions/56980078
复制相似问题