【问题标题】:mongodb aggregate or loopmongodb聚合或循环
【发布时间】:2020-09-02 04:35:58
【问题描述】:

我有一个关于mongodb的“聚合”功能的问题

如果我有一个任务,我可以通过循环所有文档 1 次来解决它。但是我需要使用“聚合”功能(还需要查询所有文档)3次以上才能解决。

数据结构:

{
  _id: 'XXX', 
  list_of_content: [{type: 'cat or dog', 'emotion': 'happy or sad'}]
} 

如果我的数据是这样的,我想统计“内容”属于“猫”、“狗”、“快乐”和“悲伤”的数量。如果我循环遍历文档,我只需要计算数量并在一个循环内解决这个问题。

如果我使用聚合,我需要展开它并使用 2 个聚合函数

哪种方式效率更高?

【问题讨论】:

  • 它基于您的数据负载。基本上我们使用聚合而不是循环
  • {'_id': 'XXX', list_of_content: [{type: 'cat or dog', 'emotion': 'happy or sad'}]} 如果我的数据是这样的,我想要数“内容”的数量属于“猫”、“狗”、“快乐”和“悲伤”。如果我遍历文档,我只需要计算数量并在一个循环内解决这个问题。如果我使用聚合,我需要使用 2 个聚合函数...
  • 你的数据多长时间?
  • 非常大..并且还在增长,目前约为 20k
  • 随着它的发展,最好使用聚合,因为所有过程都作为数据库中的单个过程发生

标签: mongodb mongodb-query


【解决方案1】:

与 $group、$sum 和 $cond 的聚合可以得到你想要的。

首先展开数组,然后按常量 $group,以便将所有文档收集到一个结果中,使用 $sum 进行计数,使用 $cond 确定每个文档要增加的总和。

db.collection.aggregate([
  {$unwind: "$list_of_content"},
  {$group: {
      _id: "counts",
      cats: {
        $sum: {$cond: [{$eq: ["cat", "$list_of_content.type"]},1,0]}
      },
      dogs: {
        $sum: {$cond: [{$eq: ["dog", "$list_of_content.type"]},1,0]}
      },
      happy: {
        $sum: {$cond: [{$eq: ["happy", "$list_of_content.emotion"]},1,0]}
      },
      sad: {
        $sum: {$cond: [{$eq: ["sad", "$list_of_content.emotion"]},1,0]}
      }   
  }}
])

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多