与findByIdAndUpdate相比,更新是否具有mongoose性能优势

时间:2013-04-13 23:31:07

标签: node.js mongoose

我想通过put操作使用REST api更新基本的CRUD样式。我有一个coffeescript基类,其中@model是一个mongoose模型,如子类中的 mongoose.model('Company',schema)。我正在抛出两种方式进行PUT /更新:

und = require 'underscore'

class CRUDApi

  # using findByIdAndUpdate
  update1: (req, res) =>
    data = und.clone req.body
    delete data._id # so mongo doesn't complain
    @model.findByIdAndUpdate req.params.id, data, (e, r) ->
      res.send r

  # using update
  update2: (req, res) =>
    data = und.clone req.body
    delete data._id # so mongo doesn't complain
    @model.update { _id: req.params.id }, data, (e, r) ->
      res.send req.body

我的问题是:

1)更新和放大之间是否有任何性能差异? findByIdAndUpdate? findByIdAndUpdate似乎是一个更好的语法选择,特别是因为它返回的结果是'r'而不仅仅是增量计数,这比使用update2()中的req.body的'伪造'响应感觉更好

2)克隆请求并删除_.id属性似乎很尴尬只是因为mongoose不会抱怨。这是正常的做法吗?

1 个答案:

答案 0 :(得分:3)

1)如果您想要获取已更新的文档,使用mongoose的findByXAndUpdate()会有性能优势。在下面,它使用mongo的findAndModify方法,该方法可以在更新后返回更新的文档。另一种方法是在更新后执行find()以获取文档。返回发布的正文可能不是一个好习惯,因为它不应该被信任,因为它来自用户,并且它不会考虑允许部分更新的返回完整文档。

2)将来自req.body的传入数据过滤到您期望的字段绝对是一个好习惯,特别是因为您将它们直接传递到模型的更新函数中。剥离_id似乎是合适的。