我有 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
db.testCollection.insertOne({"key": 11});
db.testCollection.countDocuments(); // output: 8
db.testCollection.find(); // output: document with key from 4 to 11
db.runCommand( { collMod: "testCollection", cappedSize: 5 } )
对这种意外行为有什么解释吗?
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 版本支持查询