2013-04-02 13 views
10

Sto provando a specificare lo schema del mio db in mangusta. Al momento faccio questo:Mongoose: Cast to ObjectId non riuscito per il valore

var Schema = mongoose.Schema; 
var today = new Date(2011, 11, 12, 0, 0, 0, 0); 


var personSchema = new Schema({ 
    _id : Number, 
    name: { type: String, required: true }, 
    tel: { type: String, required: true }, 
    email: { type: String, required: true }, 
    newsitems: [{ type: Schema.Types.ObjectId, ref:'NewsItem'}] 
}); 

var taskSchema = new Schema({ 
    _id: Number, 
    description: { type: String, required: true }, 
    startDate: { type: Date, required: true }, 
    newsitems: [{ type: Schema.Types.ObjectId, ref:'NewsItem'}] 
}); 

var newsSchema = new Schema({ 
    _id: Number, 
    creator : { type: Schema.Types.ObjectId, ref: 'Person' }, 
    task : { type: Schema.Types.ObjectId, ref: 'Task' }, 
    date: { type: Date, required:true }, 
    loc: {type: String, required: true } 
}); 

var NewsItem = mongoose.model('NewsItem', newsSchema); 
var Person = mongoose.model('Person', personSchema); 
var Task = mongoose.model('Task', taskSchema); 



var tony = new Person({_id:0, name: "Tony Stark", tel:"234234234", email:"[email protected]" }); 
var firstTask = new Task({_id:0, description:"Get an interview with the president", startDate:today}); 
var newsItem1 = new NewsItem({_id:0, creator: tony.id, task: firstTask.id, date: today, loc: "NY"}); 

newsItem1.save(function (err) { 
    if (err) console.log(err); 

    firstTask.save(function (err) { 
     if (err) console.log(err); 
    }); 

    tony.save(function (err) { 
     if (err) console.log(err); 
    }); 
}); 



NewsItem 
.findOne({ loc: "NY" }) 
.populate('creator') 
.populate('task') 
.exec(function (err, newsitem) { 
    if (err) console.log(err) 
    console.log('The creator is %s', newsitem.creator.name); 
}) 

Creo gli schemi e provo a salvare alcuni dati.

L'errore:

{ message: 'Cast to ObjectId failed for value "0" at path "creator"', 
    name: 'CastError', 
    type: 'ObjectId', 
    value: '0', 
    path: 'creator' } 

Ho scritto questo codice in base a: http://mongoosejs.com/docs/populate.html#gsc.tab=0

Il db provo a creare look in questo modo: Specify schema in mongoose.

Come posso risolvere questo problema?

risposta

14

L'esempio dei documenti mongoose a cui si fa riferimento utilizza Number per il campo personSchema._id e ObjectId per gli altri.

Presumo che facciano questo nell'esempio solo per dimostrare che è possibile utilizzarlo entrambi. Se non si specifica _id nello schema, ObjectId sarà l'impostazione predefinita.

Qui, tutti i record hanno un campo _id che è un ObjectId, eppure li stai trattando come numeri. Inoltre, campi come e taskID non esistono, a meno che tu non abbia omesso la parte in cui li definisci.

Se si desidera utilizzare i numeri per tutti i campi _id, è necessario definirlo negli schemi.

var newsSchema = new Schema({ 
    _id: Number, 
    _creator: {type: ObjectId, ref: "Person"}, 
    // ... 
}) 

var personSchema = new Schema({ 
    _id: Number, 
    // ... 
}) 

Quindi per creare una notizia con una particolare ID, e assegnarlo a un creatore:

var tony = new Person({_id: 0}); 
var newsItem = new NewsItem({_id: 0, creator: tony.id}); 

Tuttavia la cosa da notare qui è che quando si utilizza qualcosa di diverso ObjectId come il _id campo, ti stai assumendo la responsabilità di gestire questi valori da solo. I ObjectID sono autogenerati e non richiedono alcuna gestione aggiuntiva.

Modifica: ho anche notato che stai memorizzando i riferimenti su entrambi i lati delle tue associazioni. Questo è totalmente valido e potresti volerlo fare a volte, ma tieni presente che dovresti occuparti di memorizzare i riferimenti personalmente nel gancio pre.

+0

thx per l'aiuto, sebbene durante l'interrogazione e il popolamento, ottengo un errore. Ti capita di sapere cosa ho fatto di sbagliato? (ha aggiornato la domanda) – Ojtwist

+0

Li hai salvati? Sembra che dovrebbe funzionare, a meno che non stia caricando una notizia precedente che è stata salvata senza un creatore. – numbers1311407

+0

L'ho appena aggiunto, anche se penso che stia sbagliando. – Ojtwist

4

Stavo ricevendo questo errore dopo aver creato uno schema: CastError: Cast to ObjectId failed for value “[object Object]” at path “_id” Quindi modificarlo e non è stato possibile rintracciarlo. Ho eliminato tutti i documenti nella raccolta e ho potuto aggiungere 1 oggetto ma non un secondo. Alla fine ho cancellato la collezione in Mongo e questo ha funzionato mentre Mongoose ricreava la collezione.

Problemi correlati