Применяет ли индекс 2dsphere в схеме мангуста значение поля местоположения?

У меня есть схема и модель мангуста, определяемая следующим образом:

var mongoose = require('mongoose')
  , Schema = new mongoose.Schema({
      email: {
        index: {
          sparse: true,
          unique: true
        },
        lowercase: true,
        required: true,
        trim: true,
        type: String
      },
      location: {
        index: '2dsphere',
        type: [Number]
      }
    })
  , User = module.exports = mongoose.model('User', Schema);

Если я попытаюсь:

var user = new User({ email: '[email protected]' });

user.save(function(err) {
  if (err) return done(err);

  should.not.exist(err);
  done();
});

Получаю сообщение об ошибке:

MongoError: Can't extract geo keys from object, malformed geometry?:{}

Несмотря на то, что поле местоположения в этой схеме не требуется, оно, похоже, действует как таковое. Я попытался добавить default: [0,0], который обошел эту ошибку, однако это похоже на взломанный, поскольку это явно не очень хороший вариант, и в идеале схема не требует, чтобы пользователь всегда имел место.

У геопространственных индексов с MongoDB/mongoose подразумевается, что требуется индексировать поле?

Ответ 1

По умолчанию свойство, объявленное массивом, получает пустой пул по умолчанию для работы. MongoDB начал проверку полей geojson и кричит о пустых массивах. Работа вокруг заключается в том, чтобы добавить привязку предварительного сохранения к схеме, которая проверяет этот сценарий и сначала исправляет документ.

schema.pre('save', function (next) {
  if (this.isNew && Array.isArray(this.location) && 0 === this.location.length) {
    this.location = undefined;
  }
  next();
})

Ответ 2

Для mongoose 3.8.12 вы устанавливаете значение по умолчанию:

var UserSchema = new Schema({
  location: {
    type: {
      type: String,
      enum: ['Point'],
      default: 'Point',
    },
    coordinates: {
      type: [Number],
      default: [0, 0],
    }
  }
});

UserSchema.index({location: '2dsphere'});

Ответ 3

Единственный способ решить эту проблему - изменить тип индекса с.

GEO:{
    type: [Number],
    index: '2dsphere'
}

в

GEO:{
    type: [Number],
    index: '2d'
}

Это был кошмар

Ответ 4

Правильный способ создания схемы с геолокацией и выполнения геопространственных запросов был

    var UserSchema = new Schema({
  location: {
    type: {
      type: String,
      default: 'Point',
    },
    coordinates: {
      type: [Number]
    }
  }
});

UserSchema.index({location.coordinates: '2dsphere'});

и когда вы запускаете свой проект узла, не забудьте создать индекс как

YourScema.createIndexes();

Будьте осторожны, это важно сделать, индекс 2dsphere в location.coordinates, если вы хотите запускать геопространственные запросы!