2013-04-02 20 views
10

Próbuję określić schemat mojego db w mangusta. W tym momencie:Mongoose: Przesyłanie do ObjectId nie powiodło się dla wartości

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

Tworzę schematy i próbuję zapisać niektóre dane.

Błąd:

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

Napisałem ten kod na podstawie: http://mongoosejs.com/docs/populate.html#gsc.tab=0

db próby utworzenia wygląda następująco: Specify schema in mongoose.

Jak mogę to naprawić?

Odpowiedz

14

Przykład z dokumentów, do których się odwołałeś używa Number dla pola personSchema._id i ObjectId dla pozostałych.

Zakładam, że robią to tylko w tym przykładzie, aby pokazać, że można z nich skorzystać. Jeśli nie określisz _id w schemacie, domyślną wartością będzie ObjectId.

Tutaj wszystkie twoje zapisy mają pole _id, które jest ObjectId, ale traktujesz je jak cyfry. Ponadto pola takie jak personID i taskID nie istnieją, chyba że pominięto część, w której zostały zdefiniowane.

Jeśli chcesz używać liczb dla wszystkich pól _id, musisz to zdefiniować w schematach.

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

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

Następnie stworzyć newsa ze szczególnym ID i przypisać go do twórcy:

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

Jednak rzeczą, aby pamiętać, jest to, że podczas korzystania z czegoś innego niż ObjectId jako _id dziedzinie, sam bierzesz odpowiedzialność za zarządzanie tymi wartościami. ObjectIds są generowane automatycznie i nie wymagają dodatkowego zarządzania.

Edytuj: Zauważyłem również, że przechowujesz informacje o odwołaniach po obu stronach twoich powiązań. Jest to całkowicie poprawne i czasami możesz chcieć to zrobić, ale pamiętaj, że będziesz musiał sam zająć się przechowywaniem referencji w haku pre.

+0

thx za pomoc, ale podczas odpytywania i zapełniania pojawia się błąd. Czy zdajesz sobie sprawę, co zrobiłem źle? (zaktualizowano pytanie) – Ojtwist

+0

Czy je zapisałeś? Wygląda na to, że powinien zadziałać, chyba że wczytuje poprzedni element wiadomości, który został zapisany bez twórcy. – numbers1311407

+0

Dodałem to, chociaż myślę, że robię to źle. – Ojtwist

4

Otrzymałem ten błąd po utworzeniu schematu: CastError: Cast to ObjectId failed for value “[object Object]” at path “_id” Następnie modyfikując go i nie mogłem go wyśledzić. Usunąłem wszystkie dokumenty z kolekcji i mogłem dodać 1 obiekt, ale nie sekundę. Skończyło się na usunięciu kolekcji w Mongo i działało jak Mongoose odtworzyło kolekcję.