获取 MongoDB 中特定字段平均值的最快方法

发布于 2024-11-16 10:30:35 字数 440 浏览 2 评论 0原文

假设我有一个如下所示的数据集:

{ "_id" : ObjectId("4dd51c0a3f42cc01ab0e6506"), "views" : 1000, "status" : 1 }
{ "_id" : ObjectId("4dd51c0e3f42cc01ab0e6507"), "views" : 2000, "status" : 1 }
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 3000, "status" : 1 }
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 4000, "status" : 0 }

获得状态为 1 的所有文档的平均查看次数的最快方法(性能方面)是什么?像这样的基本功能是否需要 Map/Reduce,还是有其他方法?

Let's say I have a dataset like the following:

{ "_id" : ObjectId("4dd51c0a3f42cc01ab0e6506"), "views" : 1000, "status" : 1 }
{ "_id" : ObjectId("4dd51c0e3f42cc01ab0e6507"), "views" : 2000, "status" : 1 }
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 3000, "status" : 1 }
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "views" : 4000, "status" : 0 }

What is the fastest way (performance-wise) to get the average number of views for all documents with a status of 1? Is Map/Reduce required for something basic like this, or is there another way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

总以为 2024-11-23 10:30:35

使用组:http://www.mongodb.org/display/DOCS/Aggregation

需要一个用于文件的计数器和另一个用于视图总和的计数器。在最终确定中,您只需对这两个数字进行除法即可。

db.test.group(
   { cond: {"status": 1}
   , initial: {count: 0, total:0}
   , reduce: function(doc, out){ out.count++; out.total += doc.views }
   , finalize: function(out){ out.avg = out.total / out.count }
} );

Use group: http://www.mongodb.org/display/DOCS/Aggregation

you need a counter for the documents and another for the sum of views. In finalize you just do a division on these two numbers.

db.test.group(
   { cond: {"status": 1}
   , initial: {count: 0, total:0}
   , reduce: function(doc, out){ out.count++; out.total += doc.views }
   , finalize: function(out){ out.avg = out.total / out.count }
} );
本王不退位尔等都是臣 2024-11-23 10:30:35

在任何情况下获得平均值的更快方法 - 预先计算它(可能您可以在后台执行此操作)并创建额外的字段/集合来存储它。

Faster way to get average in any case - precalculate it(probably you can do this in background) and create extra field/collection to store it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文