Mongoose 从其他字段创建自定义 _id

Posted

技术标签:

【中文标题】Mongoose 从其他字段创建自定义 _id【英文标题】:Mongoose create custom _id from other fields 【发布时间】:2012-08-26 13:02:33 【问题描述】:

我知道如果没有给出 ObjectID,Mongoose 会自动使用 ObjectID 填充 _id 字段,并且您可以在构建模型和实例时覆盖 _id。

我想要什么:以透明的方式从其他字段创建 _id。我想在创建模型实例时省略 _id 字段,然后调用一个函数来填充它。此函数应在 Schema 级别声明,使用该模型的人不知道 _id 是由函数而不是 Mongoose 填充的。

有没有漏掉的Schema构造函数的钩子或参数?

猫鼬 3.0.x

让我们更具体一点。 想象一下BlogPost,我想通过添加标题来创建漂亮的 URL。为了将 slug 映射到 Mongo 对象,我对 slug 进行哈希处理并将其转换为 ObjectID 以利用它的好处。现在我正在寻找的是一种透明的方法,它允许我通过只传入title 来创建BlogPost 的实例,并自动生成slug_id 属性。

【问题讨论】:

【参考方案1】:

title 上使用一个setter,它会为您提供slug 和id:https://gist.github.com/3658511

如果您想确保您的代码仅在创建对象后执行,请检查 setter 中的 this.isNew

【讨论】:

我也回复了 GH。一开始听起来不错,但是每次都会调用 setter,但我只需要一次(这很重要)。【参考方案2】:

这是你要找的吗?

您可以在保存模型之前定义一个函数来创建 _id,如下所示: http://mongoosejs.com/docs/middleware.html

如果默认情况下在 Mongoose 创建 _id 之后调用此中间件(我猜不是),您可以使用 _id 选项告诉 Mongoose 不要创建 _id。 http://mongoosejs.com/docs/guide.html#options

【讨论】:

嗯,一个问题是缺少init 事件的文档(在您的第一个链接上单击它) 您不需要初始化事件:只需使用“pre”中间件。 mongoosejs.com/docs/api.html#schema_Schema-pre 是的,但是 pre('init') 的文档在哪里?它会在调用构造函数时触发还是在 Schema 准备就绪时触发? 在“事件”下查看上面的链接,虽然我猜你也可以用保存事件做你想做的事。 @Prinzhorn init 方法是私有的,这导致该链接无法正常工作。单击页面底部的小“私有”复选框以查看所有私有方法。 init 方法在从数据库返回文档后在内部调用。

以上是关于Mongoose 从其他字段创建自定义 _id的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose.js 除了 _id & __v 默认来自查询结果

Mongoose.js 除了 _id & __v 默认来自查询结果

在猫鼬中填充引用到其他字段而不是_id,引用自定义字段而不是_id

Mongoose:使用 _id 以外的字段填充路径

从自定义工作项内部参考 Wiki 页面

如何在 Mongoose 中定义除 _id 之外的其他主键?