当前位置: 首页 > 知识库问答 >
问题:

在MongoDB中查找最大文档大小

陶璞
2023-03-14

是否可以在MongoDB中找到最大的文档大小?

db。收集stats()显示的是平均大小,这并不具有代表性,因为在我的例子中,大小可能会有很大差异。

共有3个答案

姚丰羽
2023-03-14

使用聚合框架和关于集合中文档的一点点知识,在MongoDB集合中查找最大的文档可能比其他答案快约100倍。此外,您将在几秒钟内获得结果,而其他方法只需几分钟(foreach,或者更糟的是,将所有文档发送到客户端)。

您需要知道文档中的哪些字段可能是最大的字段—您几乎总是知道的。只有两种实用的1MongoDB类型可以具有不同的大小:

  • 阵列

聚合框架可以计算每个节点的长度。请注意,数组的大小不是以字节为单位的,而是以元素为单位的长度。然而,更重要的是异常值文档是什么,而不是它们占用多少字节。

下面是数组的操作方法。举个例子,假设我们在社交网络中有一个用户集合,我们怀疑数组friends.ids可能非常大(实际上,您可能应该保持一个单独的字段,如朋友计数与数组,但为了举例,我们假设它不可用):

db.users.aggregate([
    { $match: {
        'friends.ids': { $exists: true }
    }},
    { $project: { 
        sizeLargestField: { $size: '$friends.ids' } 
    }},
    { $sort: {
        sizeLargestField: -1
    }},
])

关键是使用$size聚合管道运算符。它只适用于数组,那么文本字段呢?我们可以使用$strLenBytes运算符。假设我们怀疑bio字段也可能非常大:

db.users.aggregate([
    { $match: {
        bio: { $exists: true }
    }},
    { $project: { 
        sizeLargestField: { $strLenBytes: '$bio' } 
    }},
    { $sort: {
        sizeLargestField: -1
    }},
])

您还可以使用$sum组合$size$strLenBytes来计算多个字段的大小。在绝大多数情况下,20%的字段将占据80%的大小(如果不是10/90甚至1/99),并且大字段必须是字符串或数组。

1从技术上讲,很少使用的binData类型也可以具有可变大小

殷浩慨
2023-03-14

注意:这将尝试将整个结果集存储在内存中(从. toArray)。小心大数据集。请勿在生产中使用!Abishek的答案具有在光标上工作而不是在内存阵列上工作的优势。

如果你还想要_id,试试这个。给定一个名为“请求”的集合

// Creates a sorted list, then takes the max
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop();

// { "size" : 3333, "_id" : "someUniqueIdHere" }
顾磊
2023-03-14

可以使用小型外壳脚本获取此值。

注意:这将执行全表扫描,这在大型集合中会很慢。

let max = 0, id = null;
db.test.find().forEach(doc => {
    const size = Object.bsonsize(doc); 
    if(size > max) {
        max = size;
        id = doc._id;
    } 
});
print(id, max);
 类似资料:
  • 给定包含以下文档的集合: 我需要返回ip值为X的所有文档,但前提是X的关联时间戳是ips数组中的最高时间戳(因此,上面的示例文档不应与搜索“222222222”匹配,因为这不是具有最新时间戳的ip)。 这是我第一次在MongoDB中做任何超出相当基本的东西,所以我能得到的最接近的是: 科尔。聚合({$匹配:{“ips.ip”:X}}},{$组:{“\u id”:“$主机”,“max”:{$max:

  • 我对MongoDB和聚合有最基本的了解。我还没有找到一个明确的例子来说明如何比较多个符合标准的文档并返回1个具有特定属性中最大值的文档。 假设我们收集了以下文档: 如何按名称进行筛选(),然后返回具有最高值的文档?

  • 本文向大家介绍MongoDB中文档的最大大小是多少,包括了MongoDB中文档的最大大小是多少的使用技巧和注意事项,需要的朋友参考一下 该文档是集合中的记录。每个文档的大小限制为16 MB。文档包裹在大括号({})中。 让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出-

  • 我在MongoDB有一些收藏,例如下面的一个 我想找到“\u id”或任何其他字段的最小值和最大值。我正在使用“MongoDB指南针”。如何在MongoDB Compass中编写查询,以获得特定列的最小值和最大值

  • 我有一个只有2个文档的mongodb数据库。两者具有相同的结构: 小文档在消息中有0个对象,大文档有1000个。我数了数这两份文件上的标牌:小:28000大:450000 我使用nodeJS和常规mongodb驱动程序访问文档,并且我将索引设置为“general.sid”。 现在我要他们的将军提供文件。而且这两个文档的时间差别很大!我接收文档,进行一些计算并更新文档。 我打印接收和更新文档之前和之

  • 我是新的MongoDB,并试图从数据库检索单个文档的大小。 数据库名为“”集合名为“” 我试过: 我也尝试过: 但它只返回。如何获取文档的大小?非常感谢。