大数据上的mongodb聚合,如何限制推送群?

大数据上的mongodb聚合,如何限制推送群?,mongodb,bigdata,aggregate,push,limit,Mongodb,Bigdata,Aggregate,Push,Limit,我收集的数据: 任何名称都具有示例值: { "name" : "kamal", "val" : 5 } { "name" : "ali", "val" : 3 } { "name" : "mohammad", "val" : 12 } { "name" : "kamal", "val" : 6 } { "name" : "kamal", "val" : 10 } { "name" : "ali", "

我收集的数据: 任何名称都具有示例值:

{
    "name" : "kamal",
    "val" : 5
}
{
    "name" : "ali",
    "val" : 3
}
{
    "name" : "mohammad",
    "val" : 12
}
{
    "name" : "kamal",
    "val" : 6
}
{
    "name" : "kamal",
    "val" : 10
}
{
    "name" : "ali",
    "val" : 11
}
{
    "name" : "mohammad",
    "val" : 9
}
{
    "name" : "mohammad",
    "val" : 19
}
{    
    "name" : "ali",
    "val" : 6
}
我收集了20000000份文件。 这一天增长了一百万 请帮我解决这个问题。 mongodb中的此管道工作:

db.test.aggregate([
    {$group:{
            _id:$name,
            vals:{$push:$val}
        }
    }
])
为任何名称添加所有val,但大数据内存限制不起作用。 我需要这个: 我需要在组内限制数据的推送计数

db.test.aggregate([
    {$group:{
            _id:$name,
            vals:{$push:$val , $limit:500000}
        }
    }
])

当比例上升时,没有神奇的解决方案可以使
$group
变得“快速”

有几种方法可以处理规模:

  • 升级硬件,这显然不是很有效,因为规模不断扩大,你必须不断升级硬件才能跟上。然而,在某些时候它是值得考虑的。

  • 更改体系结构:我不确定您的数据库是如何构建的,但在某些需要下,这确实可以加快某些查询,您的数据是否被切分?如果是这样的话,它是否被适当地分割?为了满足您的需求,您可能可以做很多更改,但我还没有看到一个完美的设置体系结构,在这个体系结构中,我可以说没有任何可以更改的内容来提高性能

  • 最简单的方法是使用预处理来准备数据。这意味着什么?这意味着我们将创建一个新集合,它将是
    {name:string,vals:{val:number,count:number}
    ,现在,无论何时插入或更新其中一个文档,您都必须同时更新此集合,这将产生一些开销,但这是唯一一个无需进行重大更改且易于实现的解决方案


  • 不可能

    可能的解决方法(MongoDB>=
    v3.6
    ):
    此解决方案可能适合您,但性能非常差

    注意:500.000
    val
    /
    name
    可能超过


    $group
    之前的一个阶段是否可以满足您的需要?此集合中有多少个不同的
    名称?
    db.test.distinct(“名称”)
    ?如果结果很小,我们可以定义
    $facet
    stage并手动限制每个管道。这会限制所有文档,但我需要对每个名称应用一个限制,大约1000个
    db.test.aggregate([
      {
        $group: {
          _id: "$name"
        }
      },
      {
        $lookup: {
          from: "test",
          let: {
            username: "$_id"
          },
          pipeline: [
            {
              $match: {
                $expr: {
                  $eq: [
                    "$$username",
                    "$name"
                  ]
                }
              }
            },
            {
              $project: {
                _id: 0,
                val: 1
              }
            },
            {
              $limit: 500000
            }
          ],
          as: "vals"
        }
      },
      {
        $project: {
          vals: {
            $map: {
              input: "$vals",
              in: "$$this.val"
            }
          }
        }
      }
    ],{allowDiskUse:true})