Применяет ли индекс 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, если вы хотите запускать геопространственные запросы!