当前位置: 首页 > 知识库问答 >
问题:

为什么我不能使用“0”作为mongoDB和mongoose的_id?

毋胜涝
2023-03-14

我有一个代表文件夹的对象集合。我想让用户创建文件夹,因为他们喜欢与应用程序将创建一个“根”文件夹(对象)的约束,我想控制这个文件夹的_id属性。根据mongoDB文档,我应该能够设置_id字段,但是当我尝试时,我得到一个错误:

Cast to ObjectId failed for value "0" at path "_id"

mongo文档说_id可以是数组以外的任何BSON数据类型,因此我不理解为什么“0”无效。为什么我不能使用“0”作为\u id?

为了清楚起见,我希望mongoDB为根文件夹以外的所有其他情况生成一个id。

文件夹架构:

const mongoose = require('mongoose');
const constants = require('../config/constants');

const { Schema } = mongoose;

const FolderSchema = new Schema(
  {
    user: {
      type: Schema.Types.ObjectId,
      ref: 'User',
      required: [true, 'Folder must have a user'],
    },
    name: {
      type: String,
      required: true,
      trim: true,
    },
    dateCreated: {
      type: Date,
      default: Date.now,
    },
    lastUpdated: {
      type: Date,
      default: Date.now,
    },
    parentId: {
      type: String,
      required: true,
    },
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  },
);

FolderSchema.index({ name: 'text' });

// eslint-disable-next-line func-names
FolderSchema.virtual('id').get(function () {
  return this._id.toHexString();
});

module.exports = mongoose.model('Folder', FolderSchema);

共有1个答案

郏志学
2023-03-14

您需要在模式中声明\u id应具有的格式。Mongoose默认为BSON ObjectId,但可以根据文档进行覆盖:(emphasis mine)

您还可以用自己的_id覆盖Mongoose的默认_id。请注意:Mongoose将拒绝保存没有_id的文档,因此如果您定义自己的_id路径,您有责任设置_id。

const schema=newschema({u id:Number}) const Model=mongoose。模型(“测试”,模式)

const doc=new Model() 等待单据。save();//抛出“保存前文档必须有_id”

doc_id=1 等待单据。save();//作品

将此应用于架构:

const FolderSchema = new Schema(
  {
    _id: {
      type: Number,
      required: true,
    },
    user: {
      type: Schema.Types.ObjectId,
      ref: 'User',
      required: [true, 'Folder must have a user'],
    },
    name: {
      type: String,
      required: true,
      trim: true,
    },
    dateCreated: {
      type: Date,
      default: Date.now,
    },
    lastUpdated: {
      type: Date,
      default: Date.now,
    },
    parentId: {
      type: String,
      required: true,
    },
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  },
);

 类似资料:
  • 问题内容: 我有一个简单的程序: 当我运行该程序时,我看到的只是用于输出。我原本希望我们会遇到第一轮,然后是,然后是etc。 这是由于这样的事实,一旦我们尝试在左侧重新声明,其值就会重置为? 如果有人可以指出我的详细情况,那将很棒。 更改为,似乎正在按预期方式打印数字。我对它达到最大32位值的速度感到惊讶! 问题答案: 该问题是由于整数溢出引起的。 在32位二进制补码算法中: 确实确实开始具有2的

  • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严

  • 从TensorArray读取: 使用: 问题: 回溯(最近一次调用last):RLU培训中第130行的文件“\main.py”。train()文件“C:\Users\user\Documents\Projects\rl toolkit\rl_training.py”,第129行,在train self中_rpm,赛尔夫。批量大小,自行确定。梯度步数,记录步数b=self。在call result=

  • 问题内容: 这不会执行: 错误消息是: 11-23 11:05:05.298:错误/数据库(31335):准备’创建表TestTable(名称文本,年龄整数,主键(ROWID))’时,0x2ab378上的故障1(表TestTable没有名为ROWID的列)。 但是,在创建TestTable之后,这可以准备并执行: 我可能将其视为需要自动递增主键和外​​键的解决方案,这些主键和外键永远不会用作应用程

  • 我有以下内容: 配置中的基uri是: 基本URI:/API 所以我应该能够获得localhost:8080/api/cars/test 为什么?

  • Stage.close()对我不起作用。 我查看了:JavaFX2.0:关闭一个舞台(窗口) 这是我的代码: 下面是调用消息框类的代码: