Javascript &引用;MongoError:Can';t从对象中提取地理关键点“;类型:Point

Javascript &引用;MongoError:Can';t从对象中提取地理关键点“;类型:Point,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我尝试使用以下内容准备用于地理编码的数据库字段: MyCollection._ensureIndex({'data.address.located':'2dsphere'}); 但这一错误随之而来: MongoError: Can't extract geo keys from object, malformed geometry?: { type: "Point", coordinates: [ 32.4586858, -110.8571443 ] } 我看不出这个领域有什么问题?有什么想

我尝试使用以下内容准备用于地理编码的数据库字段:

MyCollection._ensureIndex({'data.address.located':'2dsphere'});
但这一错误随之而来:

MongoError: Can't extract geo keys from object, malformed geometry?:
{ type: "Point", coordinates: [ 32.4586858, -110.8571443 ] }
我看不出这个领域有什么问题?有什么想法吗

当我查看它时,会显示以下内容:

The following example stores a GeoJSON Point:

{ loc: { type: "Point", coordinates: [ 40, 5 ] } }
问题是

[ 32.4586858, -110.8571443 ]
不是有效的坐标。顺序应该是经度,然后是纬度,而该坐标似乎是相反的(根据有效纬度范围为-90到90,并且-110.8571443在该范围之外这一事实判断)

我想你的意思是:

{ type: "Point", coordinates: [ -110.8571443, 32.4586858 ] }
或者有其他输入错误。

因为问题是坐标范围是下一个:

  • 经度:(+-)180°
  • 纬度:(+-)90°
索引期望坐标在该范围内

但是,如果您试图对已导入的数据应用索引,并且发现已交换了坐标,则可能希望将其交换回去,而不是重新导入整个集合。为此,您可以使用next
mongoshell
脚本

假设您已经拥有格式良好的
GeoJSON
,类型为
Point

db.coll.find().forEach(函数(e){
//假设'geoJson'是包含'coordinates'的字段`
e、 geoJson.coordinates=[//交换Lat/Lon
e、 geoJson.coordinates[1],//首先是经度
e、 geoJson.coordinates[0]//纬度最后一个
];
db.coll.save(e);
//有些“print(e.name)”可以到这里来了解进展情况
});

即使问题已经解决,我也需要强调,如果忽略GeoJSON对象的类型,也可能会出现此错误


在我的例子中,在模型的值中添加了
类型:'Point'

当我的经度、纬度顺序正确时,我也遇到了同样的问题。我的错误是我写了
坐标
,而不是
坐标
,mongo给了我这个:

pymongo.errors.WriteError: Can't extract geo keys: {data}  Point must be an array or object

因此,也许您的顺序正确,但您的键名有问题。

我也有同样的错误,但问题是我有一个带有两个相同坐标的
行字符串

"geometry" : {
    "type" : "LineString",
    "coordinates" : [ 
        [ 
            143.345763, 
            -33.840952
        ], 
        [ 
            143.345763, 
            -33.840952
        ]
    ]
}
我必须把它变成一个
,它才有效

"geometry" : {
    "type" : "Point",
    "coordinates" : [ 
        143.345763, 
        -33.840952
    ]
}

第一步是插入一些应该是第一个对象格式的数据,否则这个错误会出现在图片中

schema :
location:{
            type: { type: String },
            coordinates:[mongoose.Schema.Types.Mixed]
        },
然后将一些数据插入数据库

db.userDetails.createIndex({location: "2dsphere"})
仅当位置包含对象时才能创建索引

在写查询之后,如果你想找到距离

db.userDetails.aggregate( [
 $geoNear: {
                  near: { type: "Point",  coordinates: [data.lat1,data.lon1]},
                  spherical: true,
                  "distanceMultiplier" : 0.001,
                  distanceField: "calcDistance",
                  $maxDistance: distance,

               }
] )
还有一件事,数据应该在不使用quoated字符串的情况下传递

"lat":18.7323
"lon":73.1232 

像这样

该死的。。。你说得对。这太愚蠢了。。。几天前我也遇到了同样的问题,并解决了它。。。现在又犯了同样的错误。谢谢…这发生在最好的家庭!即使是我的!错误总会发生。MongoDB可以有一个更清晰的消息来解释失败的原因是经度值无效。我“喜欢”当我见过的其他系统都把
lat
放在第一位时,每个人都会为此自责。@Andreweadges这是GeoJSON标准<代码>lon
首先!我想MongoDB不会接受笛卡尔坐标,只接受横向/纵向坐标对?@Mike只要坐标在纵向/横向范围内,你就可以使用坐标。否则索引将迫使你限制你的坐标,这很容易超出这些限制,你最终将成为同一个lon/lat对。@PaulT.Rawkeen不为我工作。db.coll.save(e)未更新“coll”集合。没有错误。