Hi~朋友,关注置顶防止错过消息
如何创建Collection
MongoDB Collection可以理解为关系型数据库的表,当第一次在Collection存储数据或者创建索引时,如果该Collection不存在,则会首先创建该Collection,如下:
db.myNewCollection2.insertOne( { x: 1} );
db.myNewCollection3.createIndex( { y: 1} );
除了上述方式会创建Collection以外,我们可以通过Mongo的createCollection方法来创建,如下:
db.createCollection(name, options);
db.createCollection( <name>,
{
capped: <boolean>,
timeseries: { // Added in MongoDB 5.0
timeField: <string>, // required for time series collections
metaField: <string>,
granularity: <string>,
bucketMaxSpanSeconds: <number>, // Added in MongoDB 6.3
bucketRoundingSeconds: <number>// Added in MongoDB 6.3
},
expireAfterSeconds: <number>,
clusteredIndex: <document>, // Added in MongoDB 5.3
changeStreamPreAndPostImages: <document>, // Added in MongoDB 6.0
size: <number>,
max: <number>,
storageEngine: <document>,
validator: <document>,
validationLevel: <string>,
validationAction: <string>,
indexOptionDefaults: <document>,
viewOn: <string>,
pipeline: <pipeline>,
collation: <document>,
writeConcern: <document>
}
)
name为Collection的名字,第二个参数为该Collection的一些参数,如果参数设置不同,集合类型也不同,每种集合类型后面详细说:
Collection在创建时会在库上获取一个独占锁,但该锁的时间一般比较短,当Collection创建完成以后就会自动释放。
如果在事务中创建collection,事务的readCorn必须指定为local,local代表读取本地节点上的最新数据,不等待数据复制到多个节点,这保证了集合创建的即时性,避免不必要的复制等待时间,从而降低创建集合的延迟。
创建Collection需要哪些权限
通常,mongodb中内置的readWrite角色就可以拥有以上权限,可以执行在库上执行集合上的任何操作。
Capped Collection
Capped Collection是一种有上限大小的集合(空间和Document数量),类似一个环,当触发限制时新的文档会覆盖旧的文档。
Capped Collection的限制
Capped Collection创建
db.createCollection("log", { capped: true, size: 100000} )
size参数必须要指定,单位为bytes。
Capped Collection必须显示创建,不能通过insert数据的形式来创建。
其他类型的未shard的Collection可以通过convertToCapped命令将其转换为Capption类型,如下:
db.runCommand({
convertToCapped: "log2",
size: 100000
})
MongoDB 6.0以后Capped Collection支持修改size和max:
修改方式如下:
db.runCommand( { collMod: "log", cappedSize: 5242880} );
db.runCommand( { collMod: "log", cappedMax: 5000} );
Capped Collection的弊端
Capped Collection在写入时需要串行写入,因此相比于普通的Collection来说具有更低的并发和更差的性能,并且通过TTL索引我们也可以实现Collection中数据的自动删除,因此Capped Collection的使用场景并不多,常用的一种场景就是日志的存储。
MongoDB中的副本集群中的oplog.rs的使用了Capped Collection,但是他的大小可以突破配置的大小。
Capped Collection查询
Capped Collection查询默认以插入数据的顺序进行返回,也就是最老的Document先返回,如果最近的先返回通过以下查询方式:
db.log.find().sort( { $natural: -1} );
一张已存在的Collection可以通过isCapped()方法来检测是否是Capped Collection,如下:
db.log.isCapped();