2013-04-02 41 views
10

我试图指定我的数据库在猫鼬的架构。目前我这样做:猫鼬:铸造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

您引用的猫鼬文档中的示例对personSchema._id字段使用Number,对其他使用ObjectId

我认为他们在这个例子中只是为了证明它可以使用。如果在模式中未指定_id,则默认为ObjectId

在这里,您所有的记录都有一个_id字段,它是一个ObjectId,但您将它们视为数字。此外,像personIDtaskID这样的字段不存在,除非您遗漏了您定义它们的部分。

如果您确实想要为所有_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个对象,但不能添加1个对象。我最终删除了Mongo中的集合,并且在Mongoose重新创建集合时起作用。