【问题标题】:What's this casting error has to do with _id? "Cast to ObjectId failed for value "123" at path "_id"'这个转换错误与_id有什么关系? “路径“_id”处的值“123”转换为 ObjectId 失败
【发布时间】:2016-10-02 16:56:47
【问题描述】:

我正在尝试根据以下模型的查找条件填充数组。

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

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

这是 Populate 方法的代码。

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}

【问题讨论】:

  • 因为_id是一个对象,而不是字符串“123”。
  • 我明白了。我不是要求猫鼬填充_id。我要求 mongoose 查找具有上述查找条件的文档,然后填充 ObservationNumberList 数组。

标签: javascript node.js mongodb mongoose-schema


【解决方案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;
   }
});

【讨论】:

  • “在引用另一个模型之前不需要填充子文档”是什么意思?
【解决方案2】:

仅当字段引用任何集合时,填充才起作用。在您的查询中,您填充“observationNumbersList”,但在架构中您只存储字符串。 您的架构应该是

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

如果你没有使用人口然后删除.populate("observationNumbersList") 来自您的查询。

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2017-05-19
    • 2017-11-10
    • 2019-01-06
    • 2016-11-11
    • 2017-03-26
    • 2017-05-26
    • 2020-05-20
    • 2023-03-28
    相关资源
    最近更新 更多