bestsource

MongoDB '$geoNear 쿼리에 대한 인덱스를 찾을 수 없습니다'

bestsource 2023. 5. 9. 22:52
반응형

MongoDB '$geoNear 쿼리에 대한 인덱스를 찾을 수 없습니다'

난 그냥 단순한 것을 얻으려고 노력하는 것뿐입니다.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}
}

그리고 몽고드와 함께 다음 명령을 시도했습니다.

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

하지만 다음과 같은 오류가 발생합니다.

오류: {"$err": "쿼리를 실행할 수 없습니다: 오류 처리 쿼리: ns=foo.bar skip=0\nTree: GENEAR 필드=point maxdist=1.7969e+308 isNearSphere=0 || 첫 번째: 없음: 전체 경로: point\nProj: {}\nplanner에서 $GearQuery"에 대한 인덱스를 찾을 수 없습니다. "code": 1700}

아마 오늘 구글푸가 그렇게 날카롭지는 않지만 아무것도 찾을 수 없었습니다.또한 인덱스 확인 명령을 실행했습니다.제 의도는 여기가 지도 위치라는 것입니다.

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

문제가 거의 없습니다. Foo 데이터베이스의 Foo 컬렉션에 인덱스를 만들었지만 막대 컬렉션을 쿼리하고 있습니다.당신은 올바른 수집품을 가지고 있어야 합니다.

삽입한 문서를 읽으려면 geoJson 개체를 지원하는 "2dsphere" 인덱스를 추가해야 합니다.이 색인은 문서의 "점" 요소에 있어야 합니다.

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

그런 다음 쿼리에 대해 geoJson obj를 제공하여 다음과 같이 쿼리할 수 있습니다.

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

이것은 저에게도 같은 문제로 해결되었습니다.

여기서 prod는 내 컬렉션 이름이고, location은 지리적 위치(GeoPoint)를 저장하는 열의 이름입니다.

동일한 것에 대한 몇 가지 논의는 여기에서 확인할 수 있습니다.

그래서 여기에는 몇 가지 문제가 있는 것 같습니다.

  • 표시하는 데이터와 쿼리 정보에서 관련 정보는 필드 포인트 아래에 GeoJSON 형식으로 포함되어 있습니다.인덱스 작성:
db.foo.create색인({geo: "2d"})

현재 "geo"라는 필드가 없고 데이터가 있는 필드가 해당 위치에 있어야 하므로 "실패"하지 않습니다.올바른 필드인 "point"를 대신 사용했다면 GeoJSON 데이터에 대해 이 유형의 인덱스가 유효하지 않다는 오류가 표시되었을 것입니다."2dsphere" 인덱스가 필요합니다.

db.points.createIndex({ "point": "2dsphere" })
  • 동일한 문제를 확장하면 데이터는 GeoJSON 형식이며 쿼리의 형식은 레거시 좌표 쌍에 대한 것입니다.더 이상 실패하지 않도록 쿼리 인수를 변경해야 합니다.
db.points.find({point: {$근접:{$209:{유형: "점",좌표: [-84.26060492426588, 30.45023887165371]}}}})

자세한 내용은 설명서

위의 답변 외에도 이미 색인을 작성하려고 시도했지만 구문이나 필드가 잘못되었다면 실행할 수 있습니다.

db.<yourcollection>.dropIndexes();모든 인덱스를 정리하고 올바르게 다시 작성합니다.

또한 인덱스는 좌표 자체가 아니라 "좌표"의 상위에 작성되어야 합니다.

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

db.<yourcollection>.createIndex({ location: '2dsphere' });

주의하세요, "2d"와 "2dsphere"가 있습니다. 두 번째를 새로운 것으로 사용하십시오.

mongoose를 사용하여 연결하는 경우 다음과 같은 대답을 사용할 수 있습니다.

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

수집 자체보다 먼저 "수집" 속성이 있습니다.작동하지 않으면 console.log:의 db object를 확인합니다.

console.log(db)

spring-boot-starter-data-mongodb 2에서 3으로 마이그레이션하는 경우

기본적으로 인덱스 자동 구성을 비활성화하여 다음 오류를 발생시킬 수 있습니다.'unable to find index for $geoNear query'

@Configuration
public class Config extends AbstractMongoClientConfiguration {

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

언급URL : https://stackoverflow.com/questions/23188875/mongodb-unable-to-find-index-for-geonear-query

반응형