【问题标题】:Count the elements in a arrays in Mongodb documents: efficiency and performance计算MongoDB文档中数组中的元素:效率和性能
【发布时间】:2016-07-09 07:35:36
【问题描述】:

我在 mongodb 中有一个集合。文档包含一个数组。我想知道所有文档的所有数组中存在多少元素。有几种方法可以做到这一点(在这个问题中介绍:MongoDB: count the number of items in an array),我想知道哪种方法更有效,以及如何判断哪种方法更有效。

文件如下所示:

{"foo":[1,2,3,4]}
{"foo":[5,6,7]}

我可以通过运行以下任一方式获得我想要的号码:

db.countTest.aggregate([{$unwind:"$foo"},{$group:{_id:null,"total foo":{$sum:1}}}])

db.countTest.aggregate([{$project:{count:{$size:"$foo"}}},{$group:{_id:null,"total foo":{$sum:"$count"}}}])

所以我的问题是:哪种方法更有效,我如何判断哪种方法更有效。我已经使用 {explain:true} 运行了聚合查询,但是在输出中我没有发现任何特别有用的东西。我的感觉是第二种方法更有效,因为它不需要放松,但我希望能够证明这一点。询问的原因是,此示例是现实生活场景的缩小版本,包含更多、更大的文档。

另外,在 mongodb 上运行这些聚合对性能有何潜在影响?聚合是否会影响数据库的总体性能以及其他用户的响应时间?

感谢您的帮助。

【问题讨论】:

  • 经典开放式问题。
  • 一种方法必须比另一种方法更高效,运行聚合要么影响数据库的性能,要么不会。所以我不确定这个问题是如何开放式的?
  • 这是自以为是的问题。您需要自己对性能进行基准测试,看看哪些更高效,哪些不是。

标签: arrays mongodb performance


【解决方案1】:

我创建了一个包含超过 100 万个文档的集合,每个文档如下所示:

{ "_id" : ObjectId("56f155f6006ec8ceeec407ec"), "foo" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 ] }

然后我编写了一个 javascript,它运行不同的聚合查询 3 次,计算增量并打印出结果。脚本如下所示:

var start = Date.now();
db.countTest.aggregate([{$unwind:"$foo"},{$group:{_id:null,"total foo":{$sum:1}}}])
var done = Date.now();
var delta1 = done - start;
print(delta1);
var start = Date.now();
db.countTest.aggregate([{$unwind:"$foo"},{$group:{_id:null,"total foo":{$sum:1}}}])
var done = Date.now();
var delta2 = done - start;
print(delta2);
var start = Date.now();
db.countTest.aggregate([{$unwind:"$foo"},{$group:{_id:null,"total foo":{$sum:1}}}])
var done = Date.now();
var delta3 = done - start;
print(delta3);
var avDelta = (delta1 + delta2 + delta3) / 3;
print ("$Unwind query: average query duration (millis):" + avDelta);

var start = Date.now();
db.countTest.aggregate([{$project:{count:{$size:"$foo"}}},{$group:{_id:null,"total foo":{$sum:"$count"}}}])
var done = Date.now();
var delta1 = done - start;
print(delta1);
var start = Date.now();
db.countTest.aggregate([{$project:{count:{$size:"$foo"}}},{$group:{_id:null,"total foo":{$sum:"$count"}}}])
var done = Date.now();
var delta2 = done - start;
print(delta2);
var start = Date.now();
db.countTest.aggregate([{$project:{count:{$size:"$foo"}}},{$group:{_id:null,"total foo":{$sum:"$count"}}}])
var done = Date.now();
var delta3 = done - start;
print(delta3);
var avDelta = (delta1 + delta2 + delta3) / 3;
print ("$Size query: average query duration (millis):" + avDelta);

这将返回以下结果:

MongoDB shell version: 3.2.0
connecting to: test
2630
2573
2563
$Unwind query: average query duration (millis):2588.6666666666665
2026
2107
2003
$Size query: average query duration (millis):2045.3333333333333

我运行了几次,展开查询一直很慢。看看更大的文档有什么不同会很有趣,因为对具有约 250k 更复杂文档的生产集合运行类似的查询所花费的时间明显长于 2-3 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    相关资源
    最近更新 更多