【问题标题】:MongoDB update a meanMongoDB更新一个平均值
【发布时间】:2014-08-23 04:37:44
【问题描述】:

我正在尝试缓存平均订单以避免检索所有评级并避免聚合(因为要经常获得平均值): 这基本上就是我会做的:

Product.findOne _id: id, (prod) ->
  prod.mean = (prod.rate_count * prod.mean + rateCasted) / (prod.rating_count + 1)
  prod.rate_count++
  prod.save()

问题:这意味着将产品加载到应用程序中,我不想这样做(性能、并发投票...)

那么我如何通过单个update 操作来做到这一点?

【问题讨论】:

  • 您想在不检索完整对象的情况下更新产品?
  • 根本没有检索它。我知道select。我只想要一个更新请求:)
  • 与其将平均值存储在文档中,不如存储计数和总数?然后,您可以将 count 增加 1 并将 total 增加 rateCasted 原子。
  • 如果您使用的是 Mongoose,就像看起来的那样,无论如何您都无法不加载整个 Product 对象。您必须加载它来更新它!
  • @Vinz243 使用 findAndModify (docs.mongodb.org/manual/reference/method/…) 并获取旧文档。如果不存在旧文档,那么您就知道这是一个新评级。如果旧文档有评分,则采用差异。

标签: javascript node.js mongodb mongoose


【解决方案1】:

如果需要,您可以使用 Mongoose 进行此操作,并将其保留在模型中。 update 方法更新模型并且不返回它。

【讨论】:

  • 谢谢,更新方法我知道了;问题是更新不仅仅是 $inc,它还基于其他字段,例如 rating_counts
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多