集合中的我的数据:任何名称都有适用于示例的值:
{
"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
"快速"。
有几种处理规模的方法:
-
升级硬件,这显然不是很有效,因为规模不断增长,你必须不断升级硬件才能跟上。然而,这是在某些时候需要考虑的问题。
-
改变架构:我不确定你的数据库是如何构建的,但在某些需求下,这确实会加快一些查询,你的数据是分片的吗?如果是,碎片是否正确?你可能可以做很多改变来满足你的需求,我还没有看到一个完美的设置架构,我想说没有什么可以改变来提高性能。
-
其中最简单的是使用预处理来准备数据。这意味着什么?这意味着我们要创建一个新的集合
{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