错误16755 - Mongo无法提取地理密钥

NVO*_*NVO 7 geolocation mongodb

我是mongo和node.js的初学者,在现有的项目中,我们有一个带有geolocs商店的集合.我收到以下错误(我删除了一些字段)

"code" : 16755,
"errmsg" : "Can't extract geo keys: { _id: ObjectId('566990eea9c7a38740a305a3'), 
id: 50, guid: \"NL7a09b334-7524-102d-a4ef-00163e5faa0c\", version: 0, owner: 118, 
published: 1, loc: [ -9999, -9999 ], logo: \"69db95d0-d58d-40cf-80d3-ac80b8c86af8.png\" }  
can't project geometry into spherical CRS: [ -9999, -9999 ]"
Run Code Online (Sandbox Code Playgroud)

当我尝试$set在商店的一些价值观.我看到值-9999,-9999不正确但是当我尝试用(在Robomongo中)替换其他值时,我得到相同的错误.如何修复此错误,以便我可以编辑值loc并执行操作$set

kev*_*adi 0

您是正确的,该错误是由于该文档中的地理坐标无效所致(请参阅2dsphereindexes)。

假设这是您拥有的文档:

> db.test.find()

{
  "_id": ObjectId("566990eea9c7a38740a305a3"),
  "id": 50,
  "guid": "NL7a09b334-7524-102d-a4ef-00163e5faa0c",
  "version": 0,
  "owner": 118,
  "published": 1,
  "loc": [
    -9999,
    -9999
  ],
  "logo": "69db95d0-d58d-40cf-80d3-ac80b8c86af8.png"
}
Run Code Online (Sandbox Code Playgroud)

最简单的方法是使用mongoshell执行更新,方法是字段上使用ObjectId和 do a 。例如,通过将该字段设置为有效坐标(例如 [-73.97, 40.77]):$setlocloc

> db.test.update({"_id": ObjectId("566990eea9c7a38740a305a3")}, {$set:{loc:[-73.97, 40.77]}})

Updated 1 existing record(s) in 1ms
WriteResult({
  "nMatched": 1,
  "nUpserted": 0,
  "nModified": 1
})
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的示例中,我使用的字段_id保证是唯一的,因此更新命令只会更新该确切的文档。之后,您的 2dsphere 索引创建应该会成功:

> db.test.createIndex({loc:'2dsphere'})

{
  "createdCollectionAutomatically": false,
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "ok": 1
}
Run Code Online (Sandbox Code Playgroud)