- MongoDB 原子操作
所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。
原子操作符:
$set用来指定一个键并更新键值,若键不存在并创建。
{ $set : { field : value } }
$unset用来删除一个键。
{ $unset : { field : 1} }
$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
{ $inc : { field : value } }
$push:
{ $push : { field : value } }
把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。
$pushAll一次可以追加多个值到一个数组字段内。
{ $pushAll : { field : value_array } }
$pull从数组field内删除一个等于value值。
{ $pull : { field : _value } }
$addToSet增加一个值到数组内,而且只有当这个值不在数组内才增加。
$pop删除数组的第一个或最后一个元素
{ $pop : { field : 1 } }
$rename修改字段名称
{ $rename : { old_field_name : new_field_name } }
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库save后", "add" : [ "cat", "dog" ] }
> db.col.update({title:"MongoDB 教程"},{$pushAll:{"add":["dog","sheep","elephant"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库save后", "add" : [ "cat", "dog", "dog", "sheep", "elephant" ] }
> db.col.update({title:"MongoDB 教程"},{$pull:{"add":"elephant"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库save后", "add" : [ "cat", "dog", "dog", "sheep" ] }
> db.col.update({title:"MongoDB 教程"},{$pull:{"add":"cat"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库save后", "add" : [ "dog", "dog", "sheep" ] }
> db.col.update({title:"MongoDB 教程"},{$pop:{"add":"cat"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库save后", "add" : [ "dog", "dog" ] }
> db.col.update({title:"MongoDB 教程"},{$unset:{"description":1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "title" : "MongoDB 教程", "add" : [ "dog", "dog" ] }
> db.col.update({title:"MongoDB 教程"},{$rename:{"title":"name"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "add" : [ "dog", "dog" ], "name" : "MongoDB 教程" }
> db.col.update({name:"MongoDB 教程"},{$set:{"age":99}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "add" : [ "dog", "dog" ], "name" : "MongoDB 教程", "age" : 99 }
> db.col.update({name:"MongoDB 教程"},{$inc:{"age":96}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.col.find()
{ "_id" : ObjectId("5c9866fecb5b25a63c3e2672"), "add" : [ "dog", "dog" ], "name" : "MongoDB 教程", "age" : 195 }
>
- 创建文档的时间戳:可以看到该文档生成的时间
ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()
3.固定集合
集合的大小固定,类似环形队列,超出长度后再插入文档时会从队列头部插入
主要使用在日志或缓存中
创建固定集合:
db.createCollection("cappedLogCollection",{capped:true,size:10000})
4.MongoDB 复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
复制还允许您从硬件故障和服务中断中恢复数据。
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
mongodb各个节点常见的搭配方式为:一主一从、一主多从。
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
MongoDB复制结构图如下所示:

副本集特征:
N 个节点的集群
任何节点可作为主节点
所有写入操作都在主节点上
自动故障转移
自动恢复
- 分片
分片是指将数据拆分,将其分散存放在不同的机器上的过程。
基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。通过一个名为mongos的路由进程进行操作,mongos知道数据和片的对应关系(通过配置服务器)。大部分使用场景都是解决磁盘空间的问题,对于写入有可能会变差,查询则尽量避免跨分片查询。使用分片的时机:




主要部件有:
Shard:
是一个独立普通的mongod进程,保存数据信息。可以是一个副本集也可以是单独的一台服务器。 默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。
Config Server:
也叫配置服务器,是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真是数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。在生产环境通常有多个 config server 配置服务器,因为它里面存贮了集群和分片的元数据,信息很关键,一台设备挂掉了还能使用别的机器。
Query Routers:
即mongos,起到一个路由的功能,供程序连接。本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。
片键:片键必须是一个索引,数据根据这个片键进行拆分分散。通过sh.shardCollection加会自动创建索引。一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。
参考文章:
1.http://www.runoob.com/mongodb
2.https://www.cnblogs.com/aspwebchh/p/6652855.html
mongo分片链接:
https://www.cnblogs.com/clsn/p/8214345.html#auto_id_22
https://docs.mongodb.com/manual/sharding/
网友评论