Ответ MongoDB и nodejs geonear меняет местоположение? - PullRequest
0 голосов
/ 05 июля 2018

В моем приложении nodejs я запрашиваю mongodb для вывода пользователей на расстоянии 100 км от заданного адреса.

Ниже приведен тип документа:

{ 
    "_id" : ObjectId("5b26192e01e60e1e67e37b50"), 
    "loc":[2.4066412, 48.8599825]
    ....
}

И запрос nodejs:

const distance = "100000";
User.aggregate([{
    $geoNear: {
        near: {type: "Point", coordinates: [ latitude, longitude ]},
        distanceField: "loc",
        minDistance:0,
        maxDistance:distance,
        spherical: true
    }
}], function(err, resp){
    console.log(resp)
})

Этот код работает хорошо, я могу выводить пользователей на указанное расстояние, но местоположение объекта ответа изменилось:

{ 
    "_id" : ObjectId("5b26192e01e60e1e67e37b50"), 
    "loc": "5419.825102233618" // <=== WHY IT DOESN'T RETURN RIGHT DATA ?
    ....
}

Кто-то может объяснить мне, почему это изменение по сравнению с ответными данными? ожидаемый результат не:

{ 
    "_id" : ObjectId("5b26192e01e60e1e67e37b50"), 
    "loc": "5419.825102233618"
    ....
}

но:

{ 
    "_id" : ObjectId("5b26192e01e60e1e67e37b50"), 
    "loc":[2.4066412, 48.8599825]
    ....
}

Спасибо.

1 Ответ

0 голосов
/ 05 июля 2018

$ geoNear работает с геопространственными индексами, а не с полями напрямую, и я думаю, именно поэтому это может сбивать с толку. Это означает, что перед запуском $geoNear вы должны создать такой индекс:

db.col.ensureIndex({ loc: "2dsphere" })

И это единственное место, где вы указываете loc в качестве ввода для $geoNear. Затем, когда вы используете distanceField: "loc", вы определяете, что хотите получить рассчитанное расстояние в поле loc, которое просто переопределяет ваши координаты.

Таким образом, чтобы получить и расстояние, и координаты из исходного документа, вы должны определить поле расстояния как другой ключ, например:

db.col.aggregate([{
    $geoNear: {
        near: {type: "Point", coordinates: [2.4066412, 48.8599825]},
        distanceField: "distance",
        minDistance:0,
        maxDistance: 10000,
        spherical: true
    }
}])

Тогда вы получите:

{ "_id" : ObjectId("5b26192e01e60e1e67e37b50"), "loc" : [ 2.4066412, 48.8599825 ], "distance" : 0 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...