mongodb大数据聚合,如何限制群组内推送



集合中的我的数据:任何名称都有适用于示例的值:

{
"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份文件。而这每天都会增长1000000请帮我解决这个问题。mongodb中的这个管道工作:

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

为任何名称添加所有val,但在大数据内存限制下不起作用。我需要这个:我在组中需要数据的限制推送计数。

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

当规模扩大时,没有什么神奇的解决方案能让$group"快速"。

有几种处理规模的方法:

  1. 升级硬件,这显然不是很有效,因为规模不断增长,你必须不断升级硬件才能跟上。然而,这是在某些时候需要考虑的问题。

  2. 改变架构:我不确定你的数据库是如何构建的,但在某些需求下,这确实会加快一些查询,你的数据是分片的吗?如果是,碎片是否正确?你可能可以做很多改变来满足你的需求,我还没有看到一个完美的设置架构,我想说没有什么可以改变来提高性能。

  3. 其中最简单的是使用预处理来准备数据。这意味着什么?这意味着我们要创建一个新的集合{name: string, vals: {val: number, count: number},现在无论何时插入或更新某个文档,您都必须更新此集合,这将产生一些开销,但这是唯一一个不需要大更改就能工作的解决方案,而且实现起来有点容易。

不可能

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

注意:500000val/name可能超过16MB的限制

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})

MongoPlayground

相关内容

  • 没有找到相关文章

最新更新