2013-05-05 37 views
10

我定義爲貓鼬架構和模型如下:在貓鼬模式上應用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做地理空間索引意味着被索引的字段是必需的嗎?

回答

14

默認情況下,聲明數組的屬性接收一個默認的空數組來處理。 MongoDB已經開始驗證geojson字段並大聲說出空數組。解決方法是向檢查此場景的模式添加預保存鉤子並首先修復文檔。

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

這是不是可以添加到貓鼬爲{類型:[序號],索引: '2dsphere'}領域,所以它會自動處理? – 2013-08-21 17:14:47

+3

絕對:https://github.com/LearnBoost/mongoose/issues/1668 – aaronheckmann 2013-08-27 21:00:46

+0

太棒了,歡呼亞倫 – 2013-08-28 06:14:04

31

對於貓鼬3.8.12,你設置的默認值: