programing

"Mongo 오류:객체에서 지리적 키를 추출할 수 없음"(유형: 점)

newstyles 2023. 6. 28. 21:24

"Mongo 오류:객체에서 지리적 키를 추출할 수 없음"(유형: 점)

데이터베이스 필드에서 지오코딩을 준비하려고 합니다.

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 ] }

또는 다른 입력 오류가 있습니다.

@go-olleg 언급했듯이, 문제는 좌표의 범위가 다음과 같다는 것입니다.

  • 경도: (+) 180°
  • 위도: (+) 90°

및 인덱스는 좌표가 해당 범위에 있을 것으로 예상합니다.

그러나 이미 가져온 데이터에 인덱스를 적용하려고 할 때 좌표가 스왑된다는 것을 알게 되면 전체 컬렉션을 다시 가져오기보다는 인덱스를 다시 스왑하는 것이 좋습니다.이 목적을 위해 다음을 사용할 수 있습니다.mongoshell대본.

당신이 이미 잘 형성되었다고 가정할 때GeoJSON유형의Point.

db.coll.find().forEach(function (e) {
    // assuming that `geoJson` is our field containing `coordinates`
    e.geoJson.coordinates = [ // Swapping Lat/Lon
        e.geoJson.coordinates[1], // Longitude goes first
        e.geoJson.coordinates[0] // Latitude goes last
    ];
    db.coll.save(e);
    // Some `print(e.name)` can go here just to understand the progress
});

경도, 위도 순서가 맞는 동안에도 같은 문제가 있었습니다.내 실수는 내가 편지를 쓴 것입니다.coordiantes대신에coordinates몽고는 나에게 이것을 주었습니다.

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

그래서 아마도 당신은 올바른 순서를 가지고 있지만 당신의 키 이름에 문제가 있을 것입니다.

문제가 해결되었더라도 GeoJSON 개체 유형을 생략하면 이 버그도 나타날 수 있음을 강조해야 합니다.

나의 경우, 그것은 수정되었고, 추가되었습니다.type: 'Point'모델의 가치에 부합합니다.

같은 오류가 발생했지만 문제는 제게 문제가 있었습니다.LineString두 개의 동일한 좌표를 사용합니다.

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

난 이걸 만들어야만 했어요.Point그것이 유효하기 위해서는.

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

첫 번째 단계는 첫 번째 개체 형식이어야 하는 데이터를 삽입하는 것입니다. 그렇지 않으면 이 오류가 발생합니다.

schema :
location:{
            type: { type: String },
            coordinates:[mongoose.Schema.Types.Mixed]
        },

그런 다음 DB에 데이터를 삽입합니다.

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,

               }
] )

그리고 인용 문자열 없이 데이터를 전달해야 하는 것이 하나 더 있습니다.

"lat":18.7323
"lon":73.1232 

이것처럼.

제 문제는 좌표가 정수/플로트가 아닌 문자열이라는 것이었습니다.

그래서 변했어요.

{ type: "Point", coordinates: [ "8.73167870769231", "49.3182756076923" ] } }

로.

{ type: "Point", coordinates: [ 8.73167870769231, 49.3182756076923 ] } }

포함:

const lat = Number(old_lat)

언급URL : https://stackoverflow.com/questions/25150590/mongoerror-cant-extract-geo-keys-from-object-with-type-point