MongoDB - 转换为上限集合会导致意外的集合大小

问题描述 投票:0回答:1

我有 MongoDB v6.0.3 设置。我正在尝试将正常的预填充集合(包含 10 个文档)转换为大小为 5 的上限集合。

我使用的脚本:

db.testCollection.drop();

db.testCollection.insertMany([
    {"key": 1},
    {"key": 2},
    {"key": 3},
    {"key": 4},
    {"key": 5},
    {"key": 6},
    {"key": 7},
    {"key": 8},
    {"key": 9},
    {"key": 10},
]);

db.runCommand({"convertToCapped": "testCollection", size: 5});

但是当我验证结果时,我得到了 8 个文档的输出,而不是预期的 5 个文档:

db.testCollection.countDocuments(); // output: 8

db.testCollection.find(); // output: document with key from 3 to 10

我尝试过的:

  1. 使用另一个 MongoDB v5.0.3 来验证行为:相同的结果
  2. 再插入一些记录看看是否会返回预期的5个文档:相同的结果
db.testCollection.insertOne({"key": 11});

db.testCollection.countDocuments(); // output: 8

db.testCollection.find(); // output: document with key from 4 to 11
  1. 在 v6.0.3 设置中更改上限集合大小:相同的结果
db.runCommand( { collMod: "testCollection", cappedSize: 5 } )

对这种意外行为有什么解释吗?

mongodb
1个回答
1
投票

size
字段表示集合的最大大小(以bytes为单位),MongoDB将为集合预先分配该大小。如果大小字段小于或等于 4096,则集合的上限为 4096 字节。否则,MongoDB 将提高提供的大小,使其成为 256 的整数倍。

在您的情况下,您应该使用

max
字段指定集合的最大文档数。

注意

即使您指定了最大文档数,大小参数始终是必需的。如果集合在达到最大文档计数之前达到最大大小限制,MongoDB 将删除较旧的文档。

您的查询应该类似于以下内容:

  • 如果您想创建一个新的上限集合。

    db.createCollection("testCollection", { capped: true, size: 4096, max: 5 })
    
  • 如果您想将集合转换为上限。

    db.runCommand({"convertToCapped": "testCollection", size: 4096, max: 5});
    
  • 如果您想更改上限集合的大小。

    db.runCommand( { collMod: "testCollection", cappedSize: 4096 } )
    
  • 如果您想更改上限集合中的最大文档数。

    db.runCommand( { collMod: "testCollection", cappedMax: 5} )
    

注意

Mongodb 6.0 版本支持查询

参考

© www.soinside.com 2019 - 2024. All rights reserved.