Геопространственный запрос для устаревших пар координат - PullRequest
0 голосов
/ 04 сентября 2018
{
"_id" : ObjectId("5b8cfdc5a4788ace69dfe8avc"),
"userName" : "CAN_020704",
"source" : "web",
"contactDetails" : {
    "phone" : NumberLong(0),
    "email" : "",
    "address" : "",
    "city" : "",
    "state" : "",
    "district" : "",
    "subDistrict" : "",
    "pinCode" : 0.0,
    "constituency" : "",
    **"location" : {
        "longitude" : 80.250875,
        "latitude" : 13.052519
    },**
},
"educationalDetails" : [ 
    {
        "education" : "5th to 8th",
        "specialization" : "",
        "passingYear" : 0.0,
        "document" : ""
    }
],
"coursePreferences" : [ 
    {
        "sector" : "Apparel",
        "sectorId" : "2",
        "subSector" : "Fashion Design",
        "subSectorId" : "2",
        "jobRole" : "bdfbv",
        "qpCode" : "QWE/Q2345",
        "createdDate" : ISODate("2018-08-22T05:22:59.800Z")
    }
],
"certifications" : [],
"visibleTo" : [],
"createdBy" : "",
"sdmsFinancialYear" : ""
}

Мои данные о местоположении сохранены как устаревшие пары координат внутри contactDetails объекта. Я использовал 2dsphere index { "contactDetails.location" : "2dsphere" }

db.geo.find({"contactDetails.location": {"$near" : [80.248797,13.050599],"$maxDistance":0.005}},{"contactDetails.location":1,"contactDetails.state":1}) Это мой запрос. Но оболочка Монго выдает ошибку.

Error: error: { "ok" : 0, "errmsg" : "error processing query: ns=ekaushalnsdc.geoTree: GEONEAR field=contactDetails.location maxdist=0.005 isNearSphere=0\nSort: {}\nProj: { contactDetails.location: 1.0, contactDetails.state: 1.0 }\n planner returned error: unable to find index for $geoNear query", "code" : 2, "codeName" : "BadValue" } Я понял, что с моим индексом что-то не так. Это работает, если я указываю 2d индекс, но не делает, если я индексирую коллекцию на основе 2dsphere индекса. Мое требование - найти все документы на расстоянии 1 км от координат, указанных в запросе.

1 Ответ

0 голосов
/ 04 сентября 2018

После некоторых исследований выяснилось, что для запроса индекса 2dsphere запрос должен иметь следующую форму:

 db.geo.find( { "contactDetails.location" :
                     { $near :
                       { $geometry :
                          { type : "Point" ,
                            coordinates : [80.248797,13.050599] } ,
                         $maxDistance : 1000
                  } } } )

Это дает точные результаты.

...