Какое отношение эта ошибка приведения имеет к _id? «Ошибка приведения к ObjectId для значения «123» в пути «_id»‘

#javascript #node.js #mongodb #mongoose-schema

#javascript #node.js #mongodb #мангуст-схема

Вопрос:

Я пытаюсь заполнить массив на основе критериев поиска для следующей модели.

 function initSchemaAndModel() {
    observationNameAndTypeSchema = new mongoose.Schema({
        observationName:String,
        observationPrefixNumber:String,
        observationNumbersList: [{type:String, unique:true}]
    });

    ObservationNameAndTypeObject = mongoose.model("observation_name_and_type_model", observationNameAndTypeSchema);
}
  

Это код для метода заполнения.

 ObservationNameAndType.getObservationNameAndTypeModel()
    .findOne({observationName: "OBSERVATION_NAME"})
    .populate("observationNumbersList")
    .exec(function (err, observationNameAndTypeMatchedObject) {

        if(err) {
            console.error("error in finding ", err);
            return;
        }
        observationNameAndTypeMatchedObject.observationNumbersList.push(object);
        observationNameAndTypeMatchedObject.save();
    });
  

По какой-то причине я получаю эту ошибку. Я не понимаю, что является причиной этого.

  { [CastError: Cast to ObjectId failed for value "123" at path "_id"]
  message: 'Cast to ObjectId failed for value "123" at path "_id"',
  name: 'CastError',
  kind: 'ObjectId',
  value: '123',
  path: '_id',
  reason: undefined }
  

Это данные, которые я вставил в коллекцию.

 {observationName: "OBSERVATION_NAME", observationPrefixNumber: "1", observationNumbersList : "123"};
  

Вот как это выглядит в коллекции:

 { "_id" : { "$oid" : "57f13dd8607efc603a13168f"} , "observationName" : "OBSERVATION_NAME" , "observationPrefixNumber" : "1" , "observationNumbersList" : [ "123"] , "__v" : 0}
  

Комментарии:

1. Потому что _id — это объект, а не строка «123».

2. Я понимаю. Я не прошу mongoose заполнить _id . Я прошу mongoose найти документ с указанными критериями поиска, а затем заполнить массив ObservationNumberList .

Ответ №1:

Вам не нужно заполнять вложенный документ, пока вы не ссылаетесь на другую модель

 ObservationNameAndType.getObservationNameAndTypeModel()
    .findOne({observationName: "OBSERVATION_NAME"})
    .exec(function (err, observationNameAndTypeMatchedObject) {

        if(err) {
            console.error("error in finding ", err);
            return;
        }
        observationNameAndTypeMatchedObject.observationNumbersList.push(object);
        observationNameAndTypeMatchedObject.save();
    });
  

если вам нужно только тогда, вы можете напрямую нажать, используя $push следующее

 ObservationNameAndType.update({observationName: "OBSERVATION_NAME"}, {$push: {observationNumbersList: object}}, function (err, observationNameAndTypeMatchedObject) {
   if(err) {
      console.error("error in finding ", err);
      return;
   }
});
  

Комментарии:

1. Что вы подразумеваете под «Вам не нужно заполнять вложенный документ, пока вы не обратитесь к другой модели»?

Ответ №2:

Заполнение работает, только если поле ссылается на какую-либо коллекцию.В вашем запросе вы заполняете «observationNumbersList», но в схеме вы сохраняете только строку. Ваша схема должна быть

   observationNameAndTypeSchema = new mongoose.Schema({
        observationName:String,
        observationPrefixNumber:String,
        observationNumbersList: [{type:mongoose.Schema.Types.ObjectId}]
    });
  

И если вы не используете population, удалите .populate("observationNumbersList")
его из своего запроса.