MongoDB $靠近地理空间查询,稀疏复合索引错误13311

时间:2014-01-27 19:17:00

标签: mongodb geospatial

我创建了一个支持地址预测的查询,类似于Google商家信息自动填充,其中输入字段将尝试通过查找集合中最近的匹配地址(基于geo-ip-location)来预测输入的地址

我的集合中的每个文档都包含一个地址字符串,而地址的坐标却不是每个文档都有地址或坐标。

该集合还包括如下创建的复合索引:

db.collection.ensureIndex({address:1,coordinates:“2dsphere”},{sparse:true,background:true});

我的问题是当我执行查询时,如果结果集包含一个包含地址字段但没有坐标字段的文档,我会收到以下错误:

{$ err:“字段的错误类型()10!= 2”,“code”:13111}

10为空的BSON类型,2为字符串的BSON类型。

当存在复合索引时,MongoDB的地理空间搜索不会跳过没有坐标的文档。 (它使用简单的索引跳过它们。)我试图通过创建稀疏索引来解决这个问题,但稀疏选项仅适用于复合索引中的第一个字段。

是否有另一种方法可以执行快速地理空间$ near查询和/或创建仅包含所有索引字段所在的文档的复合索引?

2 个答案:

答案 0 :(得分:5)

在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-indexed字段(或字段为null或空数组),则文档将被插入但不会添加到2dsphere索引中。 / p>

有关详细信息,请参阅MongoDB问题跟踪器中的SERVER-9639 (2dsphere indexes should be sparse on geo fields)

答案 1 :(得分:3)

我查看了Userpassword的回复并尝试了他推荐的内容。虽然不理想但确实有效。

基本上,我更新了缺少BSON位置点的数据的记录:

loc: { type: 'Point', coordinates: [0, 0] }

同样,这在我的情况下也不理想。但是,没有位置的数据现在被静默忽略,如果更改为清理它,我将返回它。