Mongoose: schema.pre('save') 不是由 MyModel.update() 触发的

创建于 2011-07-16  ·  11评论  ·  资料来源: Automattic/mongoose

例子.js:

var mongoose = require('mongoose')
  , Schema = mongoose.Schema

mongoose.connect('mongodb://localhost/test')

var Thing = new Schema({
  title : String,
  content : String
})

Thing.pre('save', function(next){
  console.log("saving: %s (%s)", this.title, this.content)
  next()
})

var MyThing = mongoose.model('Thing', Thing)

var example = new MyThing({
  title : 'foo',
  content : 'bar'
})

example.save(function(err){
  MyThing.update({title:'foo'},{content:'baz'}, function(err, rs){
    console.log(rs)
  })  
})

输出:

$ node example.js 
saving: foo (bar)
1

pre 由初始保存触发,而不是由更新触发。

最有用的评论

这不是错误。 pre save 是一个钩子,在调用其 save 方法时触发实例,而不是在调用 update 时触发模型。

Model.update 让您将原子 $set 操作直接发送到 mongodb。

所有11条评论

这不是错误。 pre save 是一个钩子,在调用其 save 方法时触发实例,而不是在调用 update 时触发模型。

Model.update 让您将原子 $set 操作直接发送到 mongodb。

这是我想要的功能; 在插入稀疏数据时特别有用。

@aheckman我同意@martindale ,我觉得在 UI 中我们有$.ajax表单更新,例如通过将req.body._id传递给 post 路由,某种类型的 pre 方法会很方便。 一个示例用例是当您提交两个数字时,您希望模型有一个pre('save')来计算总数。

也许pre('update') ofc

我也注意到了这一点,所以我认为这不被认为是值得添加的增强功能。

我决定使用 aheckmann 的方法来更新我的对象的updatedOn日期字段。 然而,如果审计是我想在中间件级别使用的东西,这种方法就很糟糕。

在我的情况下设置日期对保存提交到 mongodb 的瞬间非常敏感,因为我有一个后台进程根据移动的日期和时间窗口加载更新的文档。 我并不是说会有很多时间漂移,但 aheckmann 的方法与pre('update')可能会在保存发生时包含更多的漂移。

我很想在这里看到一些中间件选项。

那么解决方法是什么? 我预计 pre('save') 会捕获更新,这在语义上对我来说似乎是保存。 由于更新如此普遍,这使得保存钩子的价值大大降低。

我不确定是否有人还在看这个,但查看猫鼬文档 -
猫鼬
在 findAndUpdate()_ 部分的 _Notes 下引用了问题/964 ,这解释了为什么这不起作用。 希望有帮助! :)

这是他妈的胡说八道。 我们不能在 setter 中做任何异步操作。 白痴。

这是一个非常古老的线程,但还可以。 有 pre 的实际上 inturup 这个或者它已经被发现了。

一切都很好,我继续并重新组织了我的代码以创建一个 findById 然后进行后续保存,因此预保存挂钩对密码进行加盐仍然有效。 我想它就是这样,虽然也有一个预更新钩子会很好,但它仍然需要两个查询来为操作提供服务,因为您必须读取数据并检查它是否使用 isModifed 进行了任何更改

标记 #964 并引起兴趣。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

CodeurSauvage picture CodeurSauvage  ·  3评论

p3x-robot picture p3x-robot  ·  3评论

ArThoX picture ArThoX  ·  3评论

adamreisnz picture adamreisnz  ·  3评论

simonxca picture simonxca  ·  3评论