2013-04-02 5 views
10

Я пытаюсь указать схему моего db в мангусте. На данный момент я это делаю:Mongoose: Cast to ObjectId не удалось присвоить значение

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

Я создаю схемы и пытаюсь сохранить некоторые данные.

Ошибка:

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

Я написал этот код, основанный на: http://mongoosejs.com/docs/populate.html#gsc.tab=0

ДБ Я пытаюсь создать выглядит так: Specify schema in mongoose.

Как это исправить?

ответ

14

В примере из документов mongoose, на которые вы ссылаетесь, используется Number для поля personSchema._id и ObjectId для остальных.

Я предполагаю, что они делают это в примере только для того, чтобы продемонстрировать, что можно использовать либо. Если вы не указали в схеме _id, то по умолчанию будет ObjectId.

Здесь у всех ваших записей есть поле _id, которое является ObjectId, но вы относитесь к ним как к номерам. Кроме того, таких полей, как personID и taskID, не существует, если только вы не указали часть, в которой вы их определяете.

Если вы хотите использовать номера для всех полей _id, вам нужно будет определить это в схемах.

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

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

Затем, чтобы создать новость с определенным ID, и назначить его создателя:

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

Однако дело здесь отметить, что, когда вы используете что-то другое, чем ObjectId как _id поле, вы берете на себя ответственность за управление этими ценностями самостоятельно. ObjectIds автоматически генерируются и не требуют дополнительного управления.

Редактировать: Я также заметил, что вы храните ссылки на обеих сторонах своих ассоциаций. Это абсолютно справедливо, и вы можете иногда это делать, но обратите внимание, что вам придется позаботиться о том, чтобы хранить ссылки сами в крюке pre.

+0

thx за помощью, хотя при запросе и заполнении я получаю сообщение об ошибке. Вы случайно не знаете, что я сделал неправильно? (обновил вопрос) – Ojtwist

+0

Вы спасли их? Кажется, он должен работать, если только он не загружает предыдущую новость, которая была сохранена без создателя. – numbers1311407

+0

Я просто добавил, что, хотя я думаю, что делаю это неправильно. – Ojtwist

4

Я получаю эту ошибку после создания схемы: CastError: Cast to ObjectId failed for value “[object Object]” at path “_id” Тогда модификация и не удалось ее отслеживать. Я удалил все документы в коллекции, и я мог добавить 1 объект, но не второй. Я закончил удаление коллекции в Монго, и это работало, когда Mongoose воссоздал коллекцию.

Смежные вопросы