【问题标题】:MongoDB $divide on aggregate outputMongoDB $divide on聚合输出
【发布时间】:2019-10-17 08:48:54
【问题描述】:

是否有可能对已经聚合的计算字段进行数学运算?

我有这样的事情:

([
        {
                "$unwind" : {
                        "path" : "$users"
                }
        },
        {
                "$match" : {
                        "users.r" : {
                                "$exists" : true
                        }
                }
        },
        {
                "$group" : {
                        "_id" : "$users.r",
                        "count" : {
                                "$sum" : 1
                        }
                }
        },
])

输出如下:

{ "_id" : "A", "count" : 7 }
{ "_id" : "B", "count" : 49 }

现在我想将 7 除以 49,反之亦然。

有没有可能做到这一点?我尝试了 $project 和 $divide 但没有运气。

任何帮助将不胜感激。

谢谢,

【问题讨论】:

  • 如果AB字段是固定的,那么$project可以很容易地完成,否则你必须捕获$group的结果(.toArray()在查询的结尾)到一个变量中,然后通过循环和创建一个新对象来创建结果。
  • 嗨@vikscool,实际上我是 MongoDB 的新手,你能帮我解决 $project 的问题吗?是的,这两个字段都是固定的。

标签: mongodb mongodb-query aggregate divide


【解决方案1】:

从您的问题来看,您似乎假设结果计数仅为 2。在那种情况下,我可以假设 users.r 只能有 2 个值(除了 null)。

我建议最简单的方法是通过 javascript(如果您在 mongo 控制台中使用它)或在程序中使用它,请使用您用于访问 mongo 的语言来执行此算法)例如

var results = db.collection.aggregate([theAggregatePipelineQuery]).toArray();
print(results[0].count/results[1].count);

编辑:我正在分享上述方法的替代,因为 OP 评论了不使用 javascript 代码的限制,并且只需要通过查询来完成。在这里

([
       { /**your existing aggregation stages that results in two rows as described in the question with a count field **/ },
       { $group: {"_id": 1, firstCount: {$first: "$count"}, lastCount: {$last: "$count"} 
       },
       { $project: { finalResult: { $divide: ['$firstCount','$lastCount']} } }
])

//The returned document has your answer under `finalResult` field

【讨论】:

  • @sunyb 希望这个答案对您有所帮助。如果确实如此,请投票并接受作为答案(在答案旁边打勾)。这将有助于其他 SO 读者。
  • 是的,这是真的.. 它会像这样工作,但我希望在 MongoDB 图表中使用它。所以我需要一个聚合语句。
  • 在这种情况下,您可以使用$divide 来获取结果。您可以通过使用另一个组函数并使用$first$last 在一个文档中获取两个count 值。如果您想让我编写查询,请分享示例文档以进行测试。
  • @sunnyb 我已经在编辑部分更新了答案,结帐详情。我希望这会有所帮助,希望这有效。
猜你喜欢
  • 2019-04-06
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2017-09-03
相关资源
最近更新 更多