#node.js #mongoose #geojson
#node.js #mongoose #geojson
Вопрос:
Я отправляю объект для создания пользовательской модели.
"{
type: 'Point',
coordinates: [ 25.2239771, 51.4993224 ]
}"
И вот схема Mongoose, которую я создал.
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UserProfileSchema = new Schema(
{
userId: {
type: String,
// required: true,
unique: true,
},
userFirstName: {
type: String,
// required: true,
},
userLastName: {
type: String,
// required: true,
},
userGender: {
type: String,
// required: true,
},
userCoordinates: {
type: {
type: String,
default: 'Point',
},
coordinates: {
type: [Number],
index: '2dsphere',
},
},
},
{ collection: 'userprofilemodels' }
);
module.exports = UserProfile = mongoose.model(
'userprofilemodels',
UserProfileSchema
);
Это код, который я использую для добавления файла типа GeoJSON. Однако я получаю сообщение об ошибке.
Я также пытался добавить индекс после определения схемы
await new userProfileModel({
userId,
userFirstName,
userLastName,
userCoordinates,
})
.save()
.then(() => {
console.log('it worked!');
res.send('worked!');
})
.catch((error) => {
console.log('did not worl')
// console.log(error);
});
Если я исключу пользовательские координаты, то это сработает. Итак, определение моего объекта GeoJSON неверно. Однако я понятия не имею, где я допустил ошибки.
Ответ №1:
Mongoose поддерживает индексирование объектов GeoJSON, поэтому сначала добавьте индекс «2dsphere» к пользовательским координатам, а не к координатам внутри объекта, чтобы заставить его работать.
userCoordinates: {
type: {
type: String,
default: 'Point',
},
coordinates: {
type: [Number],
default: undefined,
required: true
},
index: '2dsphere'
},
Убедитесь, что ваши пользовательские координаты выглядят примерно так:
const userCoordinates = {
type: "Point",
coordinates: [coordinatesA, coordinatesB],
};
Комментарии:
1. Похоже, это работает. Но, только когда я обновляю свой узел, индекс каким-то образом применяется. Есть ли какой-либо способ, которым я могу применить это с самого начала?
2. Этот вид индексации применяется при создании коллекции, это ожидаемое поведение, потому что мы не должны настраивать индексы при производстве. С этого момента это должно работать
Ответ №2:
Взято из документации mongoose, похоже, что тип GeoJSON не должен быть только строкой.
вот пример с location
типом GeoJSON:
const citySchema = new mongoose.Schema({
name: String,
location: {
type: {
type: String, // Don't do `{ location: { type: String } }`
enum: ['Point'], // 'location.type' must be 'Point'
required: true
},
coordinates: {
type: [Number],
required: true
}
}
});