マングースでデータベースのスキーマを指定しようとしています。現時点で私はこれを行います:
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=
私が作成しようとしているデータベースは次のようになります: マングースでスキーマを指定 。
どうすればこれを修正できますか?
参照したマングースのドキュメントの例では、personSchema._id
フィールドにNumber
を使用し、その他のフィールドにObjectId
を使用しています。
例では、どちらかを使用できることを示すためだけにこれを行っていると思います。スキーマで_id
を指定しない場合、ObjectId
がデフォルトになります。
ここでは、すべてのレコードにObjectId
である_id
フィールドがありますが、それらを数値のように扱っています。さらに、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
フィールドとして使用する場合、これらの値を自分で管理する責任を負うことになります。 ObjectIdは自動生成され、追加の管理は必要ありません。
編集:あなたがあなたの協会の両側にrefを保存していることにも気づきました。これは完全に有効であり、時々実行したい場合もありますが、参照をpre
フックに自分で格納する必要があることに注意してください。
スキーマを作成した後、次のエラーが発生しました:CastError: Cast to ObjectId failed for value “[object Object]” at path “_id”
それからそれを修正し、それを追跡することができませんでした。コレクション内のすべてのドキュメントを削除しました。1つのオブジェクトを追加できましたが、1つは追加できませんでした。私はMongoでコレクションを削除することになり、Mongooseがコレクションを再作成したときに機能しました。