MongoDb-管道聚合100mb限制的含义

  • 本文关键字:100mb 管道 MongoDb- mongodb
  • 更新时间 :
  • 英文 :


Mongodb新手我正在尝试了解聚合管道的100mb限制Mongodb。想知道这到底意味着什么?它是否适用于我们正在执行聚合的数据库集合的大小?

作为背景,我们对库存分类账进行了以下查询,我们在其中获取数据集,运行组总和以找出哪些产品仍在库存中(即金额总和大于0(。根据产品库存的结果,我们通过在原始集合中运行查找来返回这些记录。下面提供了查询。

假设库存对象包含大约10个子字段/记录对。假设为1000条记录/1mb。

问题我的问题是,如果作为JSON对象数组的库存集合大小达到100mb,这是否意味着调用失败?即我们可以运行聚合的最大值是100mb x 1000条记录=100000条记录?

顺便说一句,我们所在的服务器不支持写入磁盘,因此存在问题。

db.inventory.aggregate([
{
$group: {
_id: {
"group_id": "$product"
},
"quantity": {
$sum: "$quantity"
}
}
},
{
"$match": {
"quantity": {
$gt: 0
}
}
},
{
$lookup: {
from: "inventory",
localField: "_id.group_id",
foreignField: "$product",
as: "records"
}
}
])

100MB限制是对聚合阶段使用的内存量的限制。

问题中的管道首先需要读取集合中的每个文档。它通过向存储引擎请求文档来实现这一点,存储引擎将从磁盘读取每个文档并将其存储在内存缓存中。缓存不计入100MB限制。

聚合过程将从存储引擎单独接收文档,并通过管道将其传递到第一个阻塞阶段(组是一个阻塞阶段(。

分组阶段将检查输入文档,更新匹配组中的字段,然后丢弃输入文档。

这意味着分组阶段所需的内存将是以下各项的总和:

  • 1-2个文档的大小
  • 每个结果组的总存储大小
  • 生成每个结果的操作所需的任何暂存空间

问题中的特定组阶段是返回一个产品标识符和一个整数。

使用mongo shell中的Object.bsonsize函数,我们可以看到一个空的产品ID生成一个43字节的对象:

> Object.bsonsize({_id:{group_id:null},quantity:0})
43

因此所需的总内存将是

<number of distinct `product` values> x (<size of a product value> + 43)

请注意,这些值将存储在BSON中,因此字符串的长度为+5,UUID为21字节,等等。

最新更新