MongoDB - Что не так с тем, как я создаю индекс? - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь использовать функции GeoSpatial Mon go для поиска документов на основе координат. Мне нужно создать индексы для его работы - но кажется, что я не могу создать индекс? Вы можете помочь?

Я пойду через то, что у меня есть.

//User saves the location using a PUT Command. 
props.updateBandLocation({
        geometry: { 
            type: "Point", 
            coordinates: [ lat, lon ] 
        }
    })

Вот маршрут, который помещает его в базу данных. Я пытаюсь получить индекс, созданный здесь.

router.put('/:id',    (req, res) => {
quoteGenerator.findByIdAndUpdate({_id: req.params.id}, req.body).then(() => {
    quoteGenerator.findOne({_id: req.params.id}).then(generator => res.send(generator))
    quoteGenerator.createIndex( { bandLocation: "2dsphere" } )
})

})

Индексация выдает ошибку в моем терминале, но в любом случае создает местоположение. Вот это в базе данных.

//How the query looks in the database
    "bandLocation": {
    "geometry": {
        "type": "Point",
        "coordinates": [
            32.96179,
            -96.82916850000001
        ]
    }
},

Наконец, я пытаюсь получить все документы рядом с точкой, используя этот маршрут.

router.get('/allbands/:lat/:lng',   (req, res) => {
quoteGenerator.find(
    {
    bandLocation: 
        {   $near: {
                $geometry: {
                    type : "Point",
                    coordinates : [-req.params.lng, +req.params.lat],
                }
            }
        }
    }

  ).then(bands => res.json(bands))

});

Спасибо за любую помощь, которая у вас есть предложить!

Вот моя схема -

    //Create GeoSchema 

const GeoSchema = new Schema({
    geometry: {
        type: {
            type: String,
            default: "Point",
            index: "2dsphere",

        },
        coordinates: {
            type: [Number],
        },
    } 
})

//Create Schema - Band
const AutoQuoteGeneratorSchema = new Schema({
    baseCost: {
        type: Number
    },
    mainDate: {
        type: Object
    },
    quoteGenerator: {
        type: Array,
        required: true,
    },
    userId: {
        type: String,
        required: true,
    },
    type: {
        type: String,
        required: true,
    },
    bandName: {
        type: String,
        required: true,
    },
    bandBio: {
        type: String,
        required: true,
    },
    bandLocation: GeoSchema,
    bandTour: {
        type: Array,
        required: true,
    },
    bandGenre: {
        type: String,
        required: true,
    },
    youtube: {
        type: Array,
        required: true,
    },
    published: {
        type: Boolean,
        required: true,
    },
    posts: {
        type: Array,
        required: true,
    },
});

1 Ответ

0 голосов
/ 23 апреля 2020

Хорошо, из того, что я вижу, у нас есть пара проблем:

  1. Структура:

Из индекса 2dsphere документы :

Индекс 2dsphere поддерживает данные, хранящиеся в виде объектов Geo JSON и устаревших пар координат

Какого типа объекты Geo JSON ?, они { type: <GeoJSON type> , coordinates: <coordinates> }

И какого типа устаревшие пары координат ? они имеют вид: [<longitude>, <latitude> ] или { <field1>: <x>, <field2>: <y> }

Так что мы можем видеть, что bandLocation - это ни то, ни другое, вам нужно использовать

quoteGenerator.createIndex( { "bandLocation.geometry": "2dsphere" } )

Ваши координаты находятся в неправильном порядке, вам нужно указать порядок широты и долготы. Допустимый диапазон широты в градусах -90 и +90. Ваше значение широты -96 вне диапазона. Поэтому измените ваш документ на [-96.82916850000001, 32.96179].

Теперь нам просто нужно настроить ваш запрос:

quoteGenerator.find({
    "bandLocation.geometry": 
        {   $near: {
                $geometry: {
                    type : "Point",
                    coordinates : [-req.params.lng, +req.params.lat],
                }
            }
        }
    })

** Еще одна вещь, которая всплывает, что вы создаете (пытаетесь создать) индекс каждый раз, когда происходит вызов функции, тогда как на самом деле вы должны сделать это только один раз. это не должно быть частью вашего кода. Теперь это не приведет к ошибке, но будет излишним, так как Mon go автоматически индексирует документы при изменениях / вставках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...