一尘不染

在猫鼬模式上应用2dsphere索引是否会强制要求位置字段?

node.js

我有一个猫鼬的架构和模型,定义如下:

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,因为这显然不是一个很好的默认值,理想情况下,该架构不需要用户始终有位置。

MongoDB / mongoose的地理空间索引是否暗示需要建立索引的字段?


阅读 196

收藏
2020-07-07

共1个答案

一尘不染

默认情况下,声明为数组的属性接收默认的空数组以供使用。MongoDB已经开始验证geojson字段,并大喊空数组。解决方法是在架构中添加一个预保存钩子,以检查这种情况并首先修复文档。

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