我有一个猫鼬的架构和模型,定义如下:
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: 'user@example.com' }); user.save(function(err) { if (err) return done(err); should.not.exist(err); done(); });
我收到错误消息:
MongoError: Can't extract geo keys from object, malformed geometry?:{}
尽管不需要此架构中的location字段,但无论如何它似乎都在起作用。我尝试添加default: [0,0]可以避免此错误的方法,但是似乎有点hack,因为这显然不是一个很好的默认值,理想情况下,该架构不需要用户始终有位置。
default: [0,0]
MongoDB / mongoose的地理空间索引是否暗示需要建立索引的字段?
默认情况下,声明为数组的属性接收默认的空数组以供使用。MongoDB已经开始验证geojson字段,并大喊空数组。解决方法是在架构中添加一个预保存钩子,以检查这种情况并首先修复文档。
schema.pre('save', function (next) { if (this.isNew && Array.isArray(this.location) && 0 === this.location.length) { this.location = undefined; } next(); })