Соответствие координатному массиву в запросе MongoDB - PullRequest
0 голосов
/ 01 июня 2018

У меня есть массив широты и долготы, но я не могу сопоставить весь массив.Поэтому я должен повторять цикл и выполнять следующий отдельный запрос в цикле.так что для выполнения запроса потребуется много времени.

Мой следующий запрос в цикле

Collection.find({'location':{$near:{$geometry:{type:"point",coordinates:[longitude,latitude]},$maxDistance:20}}}).exec(function(err,res){
});

Ожидаемый запрос типа

{'location':{$near:{$geometry:{type:"point",coordinates:[[longitude,latitude],[longitude,latitude],[longitude,latitude]]},$maxDistance:20}}}

У меня есть массив координат, но я не могу передать весь массив здесь, поэтому мне нужно передать одну широту и долготу в цикле.

Есть ли способ найти данные из базы данных, используя массив координат?

Обновление

Я пытался следовать Query

Collection.find({'location':{$near:{$geometry:{type:"point",coordinates:[[72.502912,23.011787],[ 72.50265, 23.011772 ]]},$maxDistance:20}}});

Я получил следующую ошибку

error: {
    "waitedMS" : NumberLong(0),
    "ok" : 0,
    "errmsg" : "invalid point in geo near query $geometry argument: { type: \"point\", coordinates: [ [ 72.50291199999999, 23.011787 ], [ 72.50265, 23.011772 ] ] }  Point must only contain numeric elements",
    "code" : 2
}

Документ

{
    "_id" : ObjectId("5abcf7ae59869428b40c5727"),
    "latitude" : 23.8787,
    "longitude" : 72.7788,
    "location" : [
        72.7788,
        23.8787
    ],
    "address" : "Ahmedabad",
    "status" : "active",
    "eventId" : "5a8d6a27733b28295db9635e",
    "eventCreateBy" : "admin",
    "description" : "",
    "isDeleted" : "0",
    "createdAt" : ISODate("2018-03-29T14:26:54.198Z"),
    "updatedAt" : ISODate("2018-03-29T14:26:54.198Z")
}

Координаты

[72.7788,23.8787] : Matched
[72.5032552,23.0122194]: Matched
[18.1519461,43.8984328]: Not Matched

1 Ответ

0 голосов
/ 01 июня 2018

Проблема

Не будет работать с $ вблизи .Функция сортирует результаты по расстоянию, и неясно, в каком порядке возвращать результаты, когда в запросе содержится более 1 $near оператора, поэтому запросы типа

db.collection.find({$or: [
    {'location':{$near:{$geometry:{type:"point",coordinates:[ 72.50325, 23.01222 ]},$maxDistance:50000}}},
    {'location':{$near:{$geometry:{type:"point",coordinates:[ 72.7788, 23.8787 ]},$maxDistance:50000}}}
]});

явно запрещены в https://github.com/mongodb/mongo/blob/3cbb3eb/src/mongo/db/query/canonical_query.cpp#L346:

// There can only be one NEAR.  If there is a NEAR, it must be either the root or the root
// must be an AND and its child must be a NEAR.
size_t numGeoNear = countNodes(root, MatchExpression::GEO_NEAR);
if (numGeoNear > 1) {
    return Status(ErrorCodes::BadValue, "Too many geoNear expressions");
} 

Обходной путь

Используется $ geoWithin .

Чтобы вернуть все документы в радиусе 50 км от любых координат (объединение):

db.collection.find(
    {$or: [
        {'location':{$geoWithin: {$centerSphere:[[ 72.50325, 23.01222 ], 50 / 6378.1]}}},
        {'location':{$geoWithin: {$centerSphere:[[ 72.7788, 23.8787 ], 50 / 6378.1]}}}
    ]}
)

возвращает оба документа.

Чтобы вернуть все документыв радиусе 50 км вокруг всех координат (пересечение):

db.collection.find(
    {$and: [
        {'location':{$geoWithin: {$centerSphere:[[ 72.50325, 23.01222 ], 50 / 6378.1]}}},
        {'location':{$geoWithin: {$centerSphere:[[ 72.7788, 23.8787 ], 50 / 6378.1]}}}
    ]}
)

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

db.collection.find(
    {$and: [
        {'location':{$geoWithin: {$centerSphere:[[ 72.50325, 23.01222 ], 500 / 6378.1]}}},
        {'location':{$geoWithin: {$centerSphere:[[ 72.7788, 23.8787 ], 500 / 6378.1]}}}
    ]}
)

вернет оба документа.

Разумеется, они не будут отсортированы.

...