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 默认来自查询结果