MongoDB脚本:集合中字段数据大小的分位数统计

2022-11-08 12:52:27 浏览数 (1)

日常开发中,有时需要了解数据分布的一些特点,比如这个colllection里documents的平均大小、全部大小等,来调整程序的设计。 对于系统中已经存在大量数据的情况,这种提前分析数据分布模式的工作套路(最佳实践)可以帮助我们有的放矢的进行设计,避免不必要的过度设计或者进行更细致的设计。

如果想获得某个collection相关的各种存储统计信息,可以使用 collStats。参见:https://www.mongodb.com/docs/v4.4/reference/operator/aggregation/collStats/#mongodb-pipeline-pipe.-collStats。

如果想获取总计、平均等简单的统计信息,可以参考这里:https://www.mongodb.com/docs/manual/core/aggregation-pipeline/#std-label-aggregation-pipeline。

下面的命令可以显示 COLLECTION 中满足条件status=’active’,字段FIELD_A, FIELD_B的数据大小的quantile analysis。实际使用时用自己的集合名、字段名以及过滤条件进行替换即可。

代码语言:javascript复制
//最大的Top10和百分比分布。
db.COLLECTION.aggregate([
  { $match: { "status": 'active' } },
  { $project: { _id: 1, FIELD_A: 1, FIELD_B: 1} },
  { $project: { documentSize: { $sum: { $bsonSize: "$$ROOT" } } } },
  { $sort: { documentSize: 1 } },
  { $group: { '_id': null, 'value': { '$push': '$documentSize' } } },
  { $project: { _id: 0, 
      "Top1": { $arrayElemAt: ["$value", { $floor: { $add: [-1, { $size: "$value" }] } } ] },
      "Top2": { $arrayElemAt: ["$value", { $floor: { $add: [-2, { $size: "$value" }] } } ] },
      "Top3": { $arrayElemAt: ["$value", { $floor: { $add: [-4, { $size: "$value" }] } } ] },
      "Top4": { $arrayElemAt: ["$value", { $floor: { $add: [-5, { $size: "$value" }] } } ] },
      "Top5": { $arrayElemAt: ["$value", { $floor: { $add: [-6, { $size: "$value" }] } } ] },
      "Top6": { $arrayElemAt: ["$value", { $floor: { $add: [-7, { $size: "$value" }] } } ] },
      "Top7": { $arrayElemAt: ["$value", { $floor: { $add: [-7, { $size: "$value" }] } } ] },
      "Top8": { $arrayElemAt: ["$value", { $floor: { $add: [-8, { $size: "$value" }] } } ] },
      "Top9": { $arrayElemAt: ["$value", { $floor: { $add: [-9, { $size: "$value" }] } } ] },
      "Top10": { $arrayElemAt: ["$value", { $floor: { $add: [-10, { $size: "$value" }] } } ] },
      "99-9%": { $arrayElemAt: ["$value", { $floor: { $multiply: [0.999, { $size: "$value" }] } } ] },
      "99%": { $arrayElemAt: ["$value", { $floor: { $multiply: [0.99, { $size: "$value" }] } } ] },
      "95%": { $arrayElemAt: ["$value", { $floor: { $multiply: [0.95, { $size: "$value" }] } } ] },
      "90%": { $arrayElemAt: ["$value", { $floor: { $multiply: [0.90, { $size: "$value" }] } } ] },
      "50%": { $arrayElemAt: ["$value", { $floor: { $multiply: [0.50, { $size: "$value" }] } } ] },
      "25%": { $arrayElemAt: ["$value", { $floor: { $multiply: [0.25, { $size: "$value" }] } } ] },
    } },
  ]);

0 人点赞