2013-05-22 85 views
24

Tôi có sơ đồ sau đây:Tài liệu tham khảo với ObjectId khi lưu trong mongoose

// ingredient 
var ingredSchema = new Schema({ 
    name: String, 
    cost: Number 
}); 

// order 
var orderSchema = new Schema({ 
    cusName: String, 
    ingredients: [{type: Schema.Types.ObjectId, ref: 'Ingredient'}] 
}); 

// create model 
var Ingredient = mongoose.model('Ingredient', ingredSchema); 
var Order = mongoose.model('Order', orderSchema); 

tôi đã lưu một thành phần bó trong một bộ sưu tập ingredients và có một giao diện người dùng mà người sử dụng chọn một tập hợp các thành phần cho bánh mì kẹp thịt của họ. sau đó tôi cố gắng tiết kiệm một trật tự cho một burger trong một bộ sưu tập orders trong cùng một cơ sở dữ liệu burgers như thế này:

// get order info from the form 
var newOrder = new Order({ cusName: req.body.name, 
          ingredients: req.body.ingredients }); 
newOrder.save(function(err) { 
    if (err) 
     return console.log('Could not save your new order', err); 
    res.redirect('/order'); 
}); 

Cuộc gọi để lưu một trật tự tạo ra các lỗi sau:

{ message: Cast to ObjectId failed for value xxx at path 'ingredients', 
    name: 'CastError', 
    type: ObjectId, 
    value: xxx, 
    path: 'ingredients' } 

tôi sử dụng mongoose phiên bản 3.6.11. Xin hãy giúp tôi hack cái này.

PS: req.body.ingredients là một mảng được tạo từ hộp kiểm.

Trả lời

22

Có 2 vấn đề có thể với mã của bạn ngay bây giờ:

1. req.body.ingredients sẽ không là một mảng của ObjectId s, và cầy mangut muốn nó ổn (tôi nghi ngờ của một này).

Trước tiên, bạn nên bỏ từng thành phần vào ObjectId. Giả req.body.ingredients là mảng, sau đó bạn sẽ làm điều gì đó như thế này:

var casted = req.body.ingredients.map(function(ingredient) { 
    return mongoose.Types.ObjectId(ingredient); 
}); 

tôi không thử nghiệm này, xem nếu nó sẽ làm việc cho bạn.

2. Mongoose đang cố gắng đúc thành phần của bạn, nhưng một trong số họ không phải là một giá trị ObjectId

ObjectId nên được bao gồm 24 ký tự hex, kiểm tra xem bạn đang đi qua giá trị như thế này để Mongoose.


Xin vui lòng, gửi kết quả nếu một trong số họ làm việc cho bạn :)

+0

Tôi chạy tùy chọn 1 và bày tỏ ném một lỗi: 'Lỗi: Đối số được thông qua năm phải là một chuỗi duy nhất của 12 byte hoặc một chuỗi 24 ký tự hex'. Tôi vẫn đang cố gắng quấn quanh cái thứ 'ObjectId' của mình. – gabeno

+0

Vâng, hãy kiểm tra tùy chọn 2 ngay bây giờ. Bạn có thể không đi qua 'ObjectId' hợp lệ. – gustavohenke

+3

Bạn đã hiểu! Lựa chọn hai móng nó. Vấn đề là tôi có 'ingred.name' được điền trong' req.body.ingredients' thay vì 'ingred._id'. Cảm ơn cho những người đứng đầu lên. – gabeno

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