2013-05-22 38 views
24

ich die folgenden Schemata habe:Referenzdokumente mit ObjectId wenn in Mungo Speicher

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

Ich habe gespeichert schon einen Haufen Zutaten in einer Sammlung ingredients und verfügen über eine Benutzeroberfläche in dem Benutzer eine Reihe von Zutaten für ihren Burger wählen. Ich versuche dann in einer anderen Sammlung ordersburgers wie diese innerhalb derselben Datenbank einen Auftrag für einen Burger zu sparen:

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

Der Anruf ein, um die folgenden Fehler zu speichern erzeugt:

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

Ich benutze Mungo Version 3.6.11. Bitte hilf mir, das zu hacken.

PS: req.body.ingredients ist ein Array aus Checkboxen.

Antwort

22

Es gibt zwei mögliche Probleme mit Ihrem Code jetzt:

1. req.body.ingredients wird kein Array von ObjectId s sein und Mungo will es in Ordnung (ich dieses einen Zweifel).

Sie sollten zuerst jede Zutat zu ObjectId gießen. req.body.ingredients Gesetzt ist Array, dann würden Sie so etwas tun:

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

ich nicht getestet haben, ob es für Sie arbeiten werden.

2. Mongoose versucht, Ihre Zutaten zu werfen, aber einer von ihnen ist keine gültige ObjectId

ObjectId sollte von 24 hex Zeichen bestehen, prüfen Sie, ob Sie Werte wie das hier vorbei Mungo.


Bitte senden Sie das Ergebnis, wenn einer von ihnen für Sie arbeiten :)

+0

Ich lief Option 1 und Express wirft einen Fehler: 'Fehler: Argument übergeben muss ein einzelner String von 12 Byte oder ein Zeichenfolge von 24 Hex-Zeichen ". Ich versuche immer noch meinen Kopf um diese 'ObjectId'-Sache zu wickeln. – gabeno

+0

Nun, überprüfen Sie Option 2 jetzt. Sie dürfen keine gültigen 'ObjectId's übergeben. – gustavohenke

+3

Du hast es! Option zwei Nägel es. Das Problem war, dass ich 'ingredient.name' in' req.body.ingredients' anstelle von 'ingred._id' aufgefüllt hatte. Danke für die Köpfe hoch. – gabeno