Mongoose:投射到ObjectId失败的价值

我试图在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); }) 

我创build模式并尝试保存一些数据。

错误:

 { 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

我尝试创build的数据库看起来像这样: 在mongoose中指定模式 。

我怎样才能解决这个问题?

       

网上收集的解决方案 "Mongoose:投射到ObjectId失败的价值"

您引用的mongoose文档中的示例对personSchema._id字段使用Number ,对personSchema._id使用ObjectId

我认为他们在这个例子中只是为了certificate可以使用这个。 如果你没有在模式中指定_idObjectId将是默认值。

在这里,所有的logging都有一个_id字段,它是一个ObjectId ,但是你把它们当作数字来对待。 此外,像personIDtaskID这样的字段不存在,除非你没有把你定义的部分省略掉。

如果你想为所有的_id字段使用数字,你必须在模式中定义它。

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

然后创build一个具有特定ID的新闻项目,并将其分配给创build者:

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

然而这里需要注意的是,当你使用ObjectId以外的东西作为_id字段时,你自己负责pipe理这些值。 ObjectIds是自动生成的,不需要额外的pipe理。

编辑:我也注意到,你正在存储您的协会的双方裁判。 这是完全有效的,你可能有时需要这样做,但是请注意,你必须照顾自己的存储在pre hook。

创build一个模式后,我收到了这个错误: CastError: Cast to ObjectId failed for value “[object Object]” at path “_id”然后修改它,并不能追查下来。 我删除了集合中的所有文件,我可以添加1个对象,但不是一秒钟。 我最终删除了Mongo中的集合,并且在Mongoose中重新创build了这个集合。