web-dev-qa-db-ja.com

マングース: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=

私が作成しようとしているデータベースは次のようになります: マングースでスキーマを指定

どうすればこれを修正できますか?

10
Olivier_s_j

参照したマングースのドキュメントの例では、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});

ただし、ここで注意すべきことは、ObjectId以外のものを_idフィールドとして使用する場合、これらの値を自分で管理する責任を負うことになります。 ObjectIdは自動生成され、追加の管理は必要ありません。

編集:あなたがあなたの協会の両側にrefを保存していることにも気づきました。これは完全に有効であり、時々実行したい場合もありますが、参照をpreフックに自分で格納する必要があることに注意してください。

14
numbers1311407

スキーマを作成した後、次のエラーが発生しました:CastError: Cast to ObjectId failed for value “[object Object]” at path “_id”それからそれを修正し、それを追跡することができませんでした。コレクション内のすべてのドキュメントを削除しました。1つのオブジェクトを追加できましたが、1つは追加できませんでした。私はMongoでコレクションを削除することになり、Mongooseがコレクションを再作成したときに機能しました。

4
Enkode