【发布时间】: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