2013-04-02 10 views
10

私のデータベースのスキーマをmongooseで指定しようとしています。現時点で私はこれを行います:マングース: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ドキュメントの例では、personSchema._idフィールドにはNumber、その他のフィールドにはObjectIdが使用されています。

私は、この例ではどちらかを使用することができることを実証するためにのみこれを行うと仮定します。スキーマに_idを指定しないと、ObjectIdがデフォルトになります。

あなたのすべてのレコードはObjectId_idフィールドですが、数字のように扱っています。さらに、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}); 

ここで注意すべきことは、あなたが_idとしてObjectId以外のものを使用した場合ということですしかし、フィールドでは、これらの値を自分で管理する責任があります。 ObjectIdは自動生成され、余分な管理は不要です。

編集:私はまたあなたの団体の両側に参考文献を保管していることに気付きました。これは完全に有効であり、ときどきやりたいと思うかもしれませんが、自分で参照を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がコレクションを再作成するのに役立ちました。