Как добавить данные GeoJSON с помощью mongoose?

#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
    }
  }
});