Mongoose: Cast to ObjectId не удалось получить значение

Я пытаюсь указать схему моего db в мангусте. На данный момент я это делаю:

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

ДБ, который я пытаюсь создать, выглядит следующим образом: Укажите схему в мангусте.

Как я могу это исправить?

Ответ 1

В примере из документов 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,
  // ...
})

Затем, чтобы создать новостной элемент с определенным идентификатором и назначить его создателю:

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

Однако следует отметить, что когда вы используете что-то отличное от ObjectId как поле _id, вы берете на себя ответственность за управление этими значениями самостоятельно. ObjectIds автоматически генерируются и не требуют дополнительного управления.

Изменить: я также заметил, что вы сохраняете ссылки на обеих сторонах своих ассоциаций. Это абсолютно справедливо, и вы можете иногда это делать, но обратите внимание, что вам придется позаботиться о том, чтобы хранить ссылки сами в pre.

Ответ 2

Я получил эту ошибку после создания схемы: CastError: Cast to ObjectId failed for value "[object Object]" at path "_id" Затем изменил его и не смог отследить. Я удалил все документы в коллекции, и я мог добавить 1 объект, но не второй. Я закончил удаление коллекции в Монго, и это сработало, поскольку Mongoose воссоздал коллекцию.