2013-05-22 4 views
24

に保存するとき、私は、次のスキーマを持っている:参考書類マングース

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

は、私はすでにコレクションingredientsにバンチ成分を保存し、ユーザーが自分のハンバーガー用食材のセットを選択UIを持っています。私は、このように同じデータベースburgers内の別のコレクションordersにハンバーガーの注文を保存しよう:

// 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'); 
}); 

順序を保存するための呼び出しは次のエラー生成します。

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

を私はマングースを使用しますバージョン3.6.11。私はこれをハックするのを助けてください。

PS:req.body.ingredientsはチェックボックスから構築された配列です。

答えて

22

あなたのコードで2つの可能性の問題が今あります

1. req.body.ingredientsObjectIdの配列ではありません、とマングースは(私はこの1つの疑問)それは大丈夫望んでいます。

すべての成分を最初にObjectIdにキャストする必要があります。それはあなたのために働くだろうかどうかを確認し、私はこれをテストしていなかった

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

req.body.ingredients仮にことは、あなたがこのような何かをするだろう、配列です。

2.マングースがあなたの食材をキャストしようとしているが、そのうちの一つが有効ObjectId

ObjectIdではありませんあなたはマングースに、このような値を渡しているかどうかを確認し、24進文字で構成されなければなりません。 `エラー:渡された引数が12バイトまたは単一の文字列でなければならないそのうちの一つは、あなたのために働く場合:)

+0

私はオプション1を実行したと表現するには、エラーがスローされます


は、結果を投稿してください24桁の16進数の文字列。私はまだこの 'ObjectId'のことを頭の中に入れようとしています。 – gabeno

+0

さて、オプション2をチェックしてください。有効な 'ObjectId'を渡すことはできません。 – gustavohenke

+3

あなたはそれを持っています!オプション2はそれを釘付けます。問題は、 'ingred.name 'が' ingred._id'の代わりに 'req.body.ingredients'に設定されていたことでした。ヘッドアップをありがとう。 – gabeno