MongoDB '无法找到$geoNear查询的索引'

iqxoj9l9  于 2023-03-22  发布在  Go
关注(0)|答案(6)|浏览(203)

我只是想让一个简单的near查询工作。

{"point": 
  {"type": "Point", 
     "coordinates": [30.443902444762696, -84.27326978424058]}, 
   "created_on": {"$date": 1398016710168}, 
   "radius": 180, 
   "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
   "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
   "expires_on": {"$date": 1399831110168}
}

我曾试着用Mongod命令:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}});

但我得到了这个错误:
错误:{“$err”:“无法执行查询:处理查询时出错:ns=foo.bar skip= 0\n树:GEONEAR字段=点maxdist=1.79769e+308 isNearSphere=0||第一个:不第一个:完整路径:点\n排序:{}\n计划:{}\n计划员返回错误:找不到$geoNear查询”,“code”的索引:17007 }
也许我的google fu今天不是那么敏锐,但我找不到任何东西。另外,我运行了确保索引命令。我的意图是,这些是Map位置。

db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});
ilmyapht

ilmyapht1#

有一些问题,你在foo数据库的foo集合上创建了索引,但是正在查询bar集合。你需要在正确的集合上。
阅读插入的文档时,需要向support the geoJson objects添加一个“2dsphere”索引。

db.bar.createIndex({point:"2dsphere"});

然后,您可以通过为查询提供geoJson obj来进行如下查询:

db.bar.find(
   { point :
       { $near :
          {
            $geometry : {
               type : "Point" ,
               coordinates : [-84.27326978424058, 30.443902444762696] },
            $maxDistance : 1
          }
       }
    }
)
smdnsysy

smdnsysy2#

db.prod.createIndex({ "location": "2d" })

这对我来说解决了同样的问题。
其中prod是我的集合名称,location是存储地理位置的列的名称(GeoPoint)
关于这一点的一些讨论可以在here中找到

kcugc4gi

kcugc4gi3#

所以这里似乎有几件事是错误的:

  • 从您显示的数据以及您的查询信息中,相关信息包含在字段点下,并采用GeoJSON格式。您的索引创建:
db.foo.createIndex({geo: "2d"})

不会“失败”,因为目前没有一个名为“geo”的字段,并且包含数据的字段应该在那个位置。如果您使用了“point”,这是正确的字段,那么您将收到一个错误,告诉您这种类型的索引对于GeoJSON数据无效。您需要一个“2dsphere”索引:

db.points.createIndex({ "point": "2dsphere" })
  • 扩展相同的问题,数据再次采用GeoJSON格式,查询的形式是传统坐标对的形式。您需要更改查询参数,以便不再失败:
db.points.find({point: {
    $near: {
        $geometry:{ 
            type: "Point", 
            coordinates: [-84.26060492426588, 30.45023887165371]
        }
    }
}})

请参阅$near的文档

yyyllmsg

yyyllmsg4#

除了上面的答案,如果您已经尝试创建一个索引,并得到了一些语法或字段错误,您可以运行
db.<yourcollection>.dropIndexes();清理所有索引并正确地重新创建它们。
此外,索引应该在“coordinates”的父节点上创建,而不是在坐标本身上创建:

{
   "_id": 59ac03d168eaaa14c2a57a00",
   "location":{
      "type":"Point",
      "coordinates":[
         131.6667,
         57.8368
      ]
   },
   "age":53,
   "username":"Brandi_Greenfelder"
}

db.<yourcollection>.createIndex({ location: '2dsphere' });
注意,有“2d”和“2dsphere”,使用第二个,因为它是新事物。

5vf7fwbs

5vf7fwbs5#

如果你使用mongoose连接,这将是正确的答案:

db.collections.<yourcollection>.createIndex({ location : "2dsphere" })

注意collection本身之前有一个“collections”属性。如果它不起作用,请检查console.log中的db object:

console.log(db)
ahy6op9u

ahy6op9u6#

如果有人从spring-boot-starter-data-mongodb 2迁移到3
They desactivated the autoconfiguration of indexes by default,这可能导致此错误'unable to find index for $geoNear query'

@Configuration
public class Config extends AbstractMongoClientConfiguration {

    @Override
    protected boolean autoIndexCreation() {
        return true;
    }
    // ...
}

相关问题