具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311
Posted
技术标签:
【中文标题】具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311【英文标题】:MongoDB $near geospatial query with sparse compound index error 13311 【发布时间】:2014-02-18 19:26:53 【问题描述】:我创建了一个支持地址预测的查询,类似于 Google 地方信息自动完成功能,其中输入字段将尝试通过查找集合中最近的匹配地址(基于地理 IP 位置)来预测输入的地址.
我的集合中的每个文档都包含一个地址字符串,以及地址的坐标,但并非每个文档都有地址或坐标。
该集合还包括如下创建的复合索引:
db.collection.ensureIndex(地址:1,坐标:“2dsphere”,稀疏:真,背景:真);
我的问题是当我执行查询时,如果结果集包含一个具有地址字段但没有坐标字段的文档,我会收到以下错误:
$err: "字段类型错误 () 10 != 2", "code": 13111
10 为 null 的 BSON 类型,2 为字符串的 BSON 类型。
当存在复合索引时,MongoDB 的地理空间搜索不会跳过没有坐标的文档。 (使用简单索引可以很好地跳过它们。)我试图通过创建稀疏索引来解决这个问题,但稀疏选项仅适用于复合索引中的第一个字段。
是否有其他方法可以执行快速地理空间 $near 查询和/或创建仅包含所有索引字段都存在的文档的复合索引?
【问题讨论】:
添加一些不存在的协调 eq 0,000000 0,00000000 并在查询中执行 $or 【参考方案1】:在 MongoDB 2.4 中,2dsphere
索引不是稀疏的,并且无法识别 sparse:true
索引修饰符。 2dsphere
地理索引中的所有文档都必须存在地理字段。相比之下,较旧的2d
索引默认是稀疏的(但不支持 GeoJSON 类型)。
随着“V2”(版本 2)2dsphere
索引的引入,这种稀疏行为在 MongoDB 2.6.0-rc0 中发生了变化。如果您从 MongoDB 2.4 升级,现有的 2dsphere
索引将继续具有当前的“V1”行为,直到您删除并重新创建这些索引。如果您尝试将“稀疏”标志应用于2dsphere
索引,也会记录一个警告。
在 V2 2dsphere
索引中,如果文档缺少 2dsphere 索引字段(或者该字段为 null 或空数组),则文档将被插入但不会添加到 2dsphere
索引中。
有关更多信息,请参阅 MongoDB 问题跟踪器中的 SERVER-9639 (2dsphere indexes should be sparse on geo fields)。
【讨论】:
【参考方案2】:我查看了 Userpassword 的回复并尝试了他的建议。虽然不理想,但它确实有效。
基本上,我使用以下 BSON 位置点更新了缺少数据的记录:
loc: type: 'Point', coordinates: [0, 0]
同样,这在我的情况下也不理想。但是,没有位置的数据现在被静默忽略,如果发生变化,我会返回它来清理它。
【讨论】:
以上是关于具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311的主要内容,如果未能解决你的问题,请参考以下文章
鉴于新的索引交集功能,复合索引何时在 MongoDB 2.6 中仍然相关?