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的主要内容,如果未能解决你的问题,请参考以下文章