Mongoose - 如何防止 mongoose 在模型实例化时创建 _id

Posted

技术标签:

【中文标题】Mongoose - 如何防止 mongoose 在模型实例化时创建 _id【英文标题】:Mongoose - How to prevent mongoose from creating _id on model instantiation 【发布时间】: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,并且不能被覆盖。我会提供当前文档的链接,但他们不再提及。 你可以发布你的模型吗? 【参考方案1】:

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

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

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

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

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

    李>

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

【讨论】:

我猜第二个选项似乎是最好的,如果我让猫鼬按照它想要的方式生成 id 但添加另一个字段,其值是在插入时由 db 设置的? (已更新问题以反映这一点)

以上是关于Mongoose - 如何防止 mongoose 在模型实例化时创建 _id的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL/Mongoose:如何防止每个请求字段调用一次数据库

如何防止 Mongoose 在修改用户后重新散列用户密码?

防止同时访问 Mongoose 中的文档

Mongoose - 更新时如何验证模型?

使用 Mongoose Schema 防止字段修改

防止多个帖子在react / mongoose中