我正在尝试在mongoose中指定我的数据库的模式。目前我这样做:
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:"tony@starkindustries.com" });
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
我尝试创建的db看起来像这样:Specify schema in mongoose。
我该如何解决这个问题?
答案 0 :(得分: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
钩子中。
答案 1 :(得分:4)
我在创建架构后收到此错误:
CastError: Cast to ObjectId failed for value “[object Object]” at path “_id”
然后修改它并且无法跟踪它。我删除了集合中的所有文档,我可以添加1个对象,但不能添加第二个。我最终删除了Mongo中的集合,并且当Mongoose重新创建集合时起作用。