【问题标题】:Mongoose - How to prevent mongoose from creating _id on model instantiationMongoose - 如何防止 mongoose 在模型实例化时创建 _id
【发布时间】:2019-02-06 13:59:37
【问题描述】:

我希望 MongoDB 本身在插入时添加一个 _id,这样我就可以使用 ObjectID 跟踪插入时间,但是当我这样做 new MyModel(...) 时,moongose 会添加 id 字段。

如何防止这种情况,以便 db 本身添加 id?

或者,我如何创建一个将由 db 设置为 INSERTION 时间的字段?

编辑:我发现这在技术上用 mongoose 是不可能的,所以可以在插入完成时添加一个由 MongoDB 设置的字段吗?

我的模型(如果相关):

{
  timestamp: {
    type: Date,
    required: true
  },
  signaler: {
    type: String,
    required: true,
    trim: true
  },
  source: {
    type: String,
    required: false,
    trim: true
  },
  category: {
    type: String,
    required: false,
    trim: true
  },
  key: {
    type: String,
    required: true,
    trim: true
  },
  level: {
    type: String,
    required: false,
    trim: true,
    uppercase: true,
    enum: ['ALARM', 'WARNING', 'NORMAL']
  },
  payload: {
    type: Schema.Types.Mixed,
    required: true
  }
}

【问题讨论】:

  • 让 mongo 做和 mongoose 有区别吗?
  • 我可能会做new MyModel(),然后再调用model.save(),因此id实际上不会跟踪插入时间,我调用save()和实际插入的文档。
  • 正如this answer 中提到的,控制这个的forceServerObjectId 连接选项被Mongoose 强制设置为false,并且不能被覆盖。我会提供当前文档的链接,但他们不再提及。
  • 你可以发布你的模型吗?

标签: node.js mongodb mongoose


【解决方案1】:

这是一个有趣的用例。当您调用模型构造函数时,Mongoose 确实会创建该 _id!

我看到了三个前进的道路:

  1. 不要使用猫鼬。较低级别的 mongo 驱动程序不会创建您插入到集合中的 _ids util。

  2. 传递一个普通的 javascript 对象,直到你准备好保存 它,然后使用 Model.create 方法。

  3. 最后,您可以使用预保存中间件来更新 _id,通过手动生成一个新的(使用 mongoose.Types.ObjectId())将具有更准确的时间信息。

    李>

如果您想引入一个在插入文档时更新的 createdAt 字段,那么您还需要处理预保存中间件。这个流行的插件就是这样做的:https://github.com/drudge/mongoose-timestamp/blob/master/index.js

【讨论】:

  • 我猜第二个选项似乎是最好的,如果我让猫鼬按照它想要的方式生成 id 但添加另一个字段,其值是在插入时由 db 设置的? (已更新问题以反映这一点)
猜你喜欢
  • 2017-06-17
  • 2018-01-31
  • 2019-05-28
  • 2014-04-03
  • 2021-03-26
  • 2019-09-13
相关资源
最近更新 更多