2013-05-05 23 views
10

Tôi có một schema cầy mangut và mô hình quy định như sau:Việc áp dụng chỉ mục 2dsphere trên lược đồ mongoose có buộc trường vị trí phải được yêu cầu không?

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); 

Nếu tôi cố gắng:

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

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

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

Tôi nhận được thông báo lỗi:

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

Mặc dù lĩnh vực vị trí trong này giản đồ không được yêu cầu, dường như nó hoạt động như anyways như vậy. Tôi đã cố gắng thêm default: [0,0] mà không phá vỡ lỗi này, tuy nhiên nó có vẻ như một chút hack, vì đây rõ ràng không phải là một mặc định tốt, và lý tưởng là lược đồ sẽ không yêu cầu người dùng phải có một vị trí ở tất cả các lần.

Chỉ mục không gian địa lý với MongoDB/mongoose ngụ ý rằng trường được lập chỉ mục là bắt buộc phải không?

Trả lời

14

Theo mặc định, thuộc tính được khai báo một mảng nhận một mảng trống mặc định để làm việc. MongoDB đã bắt đầu xác nhận các trường geojson và hét lên về các mảng trống. Công việc xung quanh là thêm một móc lưu trước vào lược đồ kiểm tra kịch bản này và sửa chữa tài liệu trước.

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

là một cái gì đó này có thể được thêm vào một loại chồn cho {type: [Số], chỉ số: '2dsphere'} lĩnh vực, vì vậy nó được tự động chăm sóc? –

+3

chắc chắn: https://github.com/LearnBoost/mongoose/issues/1668 – aaronheckmann

+0

Tuyệt vời, chúc mừng Aaron –

31

Đối mongoose 3.8.12, bạn thiết lập giá trị mặc định:

Các vấn đề liên quan