具有稀疏复合索引的 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 复合稀疏索引

鉴于新的索引交集功能,复合索引何时在 MongoDB 2.6 中仍然相关?

具有复合索引 Mongodb 的高查询目标

MongoDB ODM 索引:如何在本身具有 EmbeddedDocument 的文档上索引多个复合索引?

MongoDB Indexes

MongoDB——索引属性之稀疏索引(Sparse Indexes)