MongoDB技术问询:筛选下载上传总量超总流量80%的文档
解决MongoDB字段间运算的查询需求
嘿,我懂你要找的是那些下载量加上传量总和超过总配额80%的文档对吧?这个用MongoDB的$expr运算符就能轻松搞定,它允许我们在查询过滤阶段直接做字段之间的算术运算对比。
核心查询代码
直接用find方法配合$expr就能完成过滤,记得把yourCollectionName换成你实际的集合名称:
db.yourCollectionName.find({ $expr: { $gt: [ // 计算downloaded和uploaded的总和 { $add: ["$daily_log.downloaded", "$daily_log.uploaded"] }, // 计算total的80%阈值 { $multiply: ["$daily_log.total", 0.8] } ] } })
代码细节解释
$add:聚合表达式,用来把daily_log.downloaded和daily_log.uploaded两个字段的值相加$multiply:聚合表达式,将daily_log.total乘以0.8得到总配额的80%阈值$gt:比较运算符,判断左边的总和是否大于右边的阈值$expr:关键特性,让我们能在普通find查询里使用聚合管道的表达式,实现字段间的运算对比(这个功能从MongoDB 3.6版本开始支持)
进阶:同时查看使用百分比
如果想在结果里直接看到已使用的百分比,可以用聚合管道,在过滤后加上$project生成计算字段:
db.yourCollectionName.aggregate([ // 第一步:过滤符合条件的文档 { $match: { $expr: { $gt: [ { $add: ["$daily_log.downloaded", "$daily_log.uploaded"] }, { $multiply: ["$daily_log.total", 0.8] } ] } } }, // 第二步:投影字段并计算使用百分比 { $project: { id: 1, daily_log: 1, usedPercentage: { $multiply: [ { $divide: [ { $add: ["$daily_log.downloaded", "$daily_log.uploaded"] }, "$daily_log.total" ]}, 100 ] } } } ])
这样返回的文档会多一个usedPercentage字段,直接显示已使用的百分比(比如85就代表用了85%)。
内容的提问来源于stack exchange,提问作者şafak çağırağ
相关产品推荐
相关产品推荐

