大数据上的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.000val
/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})