Не удалось найти индекс для $geoNear Laravel

Я использую модель Moloquent с Laravel 5.6. вот моя запись коллекции, приведенная ниже: -

{
    "_id" : ObjectId("5afe619dbe0b8d0e5876b16b"),
    "name" : "Central Park",
    "categories" : [ 
        "4d4b7105d754a06376d81259", 
        "4bf58dd8d48988d116941735", 
        "4bf58dd8d48988d119941735", 
        "4d4b7105d754a06376d81259", 
        "4bf58dd8d48988d116941735", 
        "4bf58dd8d48988d119941735", 
        "4d4b7105d754a06374d81259", 
        "4bf58dd8d48988d16d941735"
    ],
    "loc" : {
        "type" : "Point",
        "coordinates" : [ 
            88.4166612820784, 
            22.5835157504658
        ]
    }
}

Я запускаю этот запрос из контроллера Laravel.

$users = MongoTest::where('loc', 'near', [
                    '$geometry' => [
                        'type' => 'Point',
                        'coordinates' => [
                            $longitude,
                            $latitude,
                        ],
                    ],
                    '$maxDistance' => 10,
                ])->get();

print_r($users);

Я получаю эту ошибку: -

error processing query: ns=tkit.testTree: GEONEAR  field=loc maxdist=10 isNearSphere=0
Sort: {}
Proj: {}
 planner returned error: unable to find index for $geoNear query

Как я могу это решить?


person Saswat    schedule 18.05.2018    source источник
comment
Конечно, путем создания геопространственного индекса. Ошибка говорит вам, что у вас нет индекса, и он должен быть в поле "loc".   -  person Neil Lunn    schedule 18.05.2018
comment
Можете ли вы предложить, как это сделать, я имею в виду структуру? Я новичок в MongoDB   -  person Saswat    schedule 18.05.2018


Ответы (1)


Создайте индекс из оболочки mongo. 2sphere index ожидается запросом с использованием $near или $nearSphere оператор или geoNear или даже $geoNear стадия конвейера агрегации.

Метод createIndex() сделает это за вас, так что просто назовите свою коллекцию в правильной базе данных:

db.collection.createIndex({ "loc": "2dsphere" })

Обратите внимание, что любой API, фактически использующий команду geoNear, действительно должен быть обновлен до одного других упомянутых операторов запросов, поскольку эта команда «устарела» начиная с MongoDB 4.0 и будет удалена.

Операции, ищущие «ближайший», должны использовать $near или $nearSphere, а те, кто хочет вернуть "расстояние", должны использовать < вместо этого используйте этап конвейера href="https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/" rel="nofollow noreferrer">$geoNear.

person Neil Lunn    schedule 18.05.2018