【问题标题】:MongooseError: Cast to ObjectID failed for value on reading json for db seedMongooseError: Cast to ObjectID failed for value on reading json for db seed
【发布时间】:2017-12-21 05:04:21
【问题描述】:

我有一个带有如下参考字段的模型方案:

const UserSchema = new mongoose.Schema({
  // ...
  uf:{
    type: mongoose.Schema.Types.ObjectId, ref: 'UF', index: true
  },
});

我的测试数据库种子代码正在使用来自 json 文件的数据,如下所示:

[
  { "_id": 91283,
    "name":"Test user",
    "uf": 124411923,
    "version": 2
  }
]

在种子过程中,在模型保存方法之后,我收到了这个错误:

ValidationError: User validation failed: uf: Cast to ObjectID failed for value "124411923" at path "uf"
errors:
{ uf:
   { MongooseError: Cast to ObjectID failed for value "124411923" at path "uf"

这是负责加载 jsons 并保存到数据库的代码,我已经对种子列表进行了排序,以便首先插入 UF:

function seed() {
  console.log('Starting db seed...');

  return Promise.each(initialData, (data) => {
    // path to mongo model js file
    let Model = require(data.model);

    removeModel(Model)
    .then(() => {
      console.log('[' + data.name + '] model removed. ');
      return saveModel(data, Model);
    }).then(() => {
      console.log('[' + data.name + '] model saved');
    }).catch( (err) => {
      console.error('Error seeding db', err);
    });
  });
}

/**
 * Saves model to the database
 * @param {*} data
 * @param {*} Model
 */
function saveModel(data, Model) {
  // path to json data file
  let seedList = require(data.seed);

  return Promise.map(seedList, function(seed) {
    let newItem = new Model(seed);
    return newItem.save({});
  });
}

谁能帮忙?

【问题讨论】:

  • 正如错误所说,124411923 不能转换为 ObjectId。
  • 没用的朋友
  • 抱歉,我只是不确定您遗漏了什么。您已在架构中将 uf 定义为 ObjectId,但您试图将 124411923 放入该字段。没有转换。
  • 我正在尝试理解 mongodb 的引用概念。如何在 json 中引用另一个 mongo 文档?就像外键一样。
  • 你可以阅读那个here

标签: json node.js mongodb mongoose seeding


【解决方案1】:

在您的用户文档中,您没有包含有效的 ObjectId,因此当您尝试存储为 ObjectId 类型时会出错。

Refs 只能保护 _id 字段免受其他集合的影响。

因此,在您的用户文档中,您需要包含对 UF 集合中的 _id 字段的引用:

[
    {
        "_id": 91283,
        "name":"Test user",
        "uf": [_id from UF here],
        "version": 2
    }
]

注意:如果您已将 UF 架构中的 _id 字段明确定义为类型 Number,那么您可以通过匹配类型从您的用户架构中引用该字段:

const UserSchema = new mongoose.Schema({
    // ...
    uf: {
        type: Number, ref: 'UF', index: true
    },
});

【讨论】:

    【解决方案2】:

    您似乎没有有效的 ObjectId 字符串。尝试使用123456789012,因为它是一个 12 字节的字符串。

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 1970-01-01
      • 2017-04-04
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2020-10-21
      相关资源
      最近更新 更多