MongoDB --- 文档型NoSQL

历史:美国10gen公司,2009年出品MongoDB,2013年改名为MongoDB公司
官网:https://www.mongodb.com/
概念
MVCC:Multiversion concurrency control,多版本并发控制,用来解决多路写操作造成的冲突
update-in-place:就地更新

NoSQL

Not Only SQL,非关系型的数据库
分类
键值数据库:Redis、Memcached等
列族数据库:BigTable、HBase、Apache Cassandra等
文档数据库:MongoDB、Apache CouchDB等
图形数据库:Neo4J等

NoSQL数据库普遍拥有的特征:
1、完整性规则比SQL数据库少,使得读写判断更少
2、数据格式随意,使得操作限制少
3、拥有缓存能力,即可将大量数据读入内存,使得内存命中率更高
4、不具备ACID特性,不能用于交易场景

MongoDB与Apache CouchDB对比
MongoDB:文档型存储,基于TCP,适用C++编写,并发模式为update-in-place,同一个collection的数据连续存储
Apache CouchDB:文档型存储,基于HTTP,并发模式为MVCC,性能比MongoDB差,不适用于经常更新的数据

MongoDB安装

Windows安装MongoDB
1、官网上下载zip包,解压
2、新建存放数据的目录
3、启动服务进程,指定数据目录:mongod.exe –dbpath 目录
4、启动Shell(客户端):双击mongo.exe

Linux安装MongoDB
1、官网上下载tzg包,放到/usr,解压 tar -zxvf
2、新建默认数据目录:mkdir -p /data/db
3、启动守护进程:bin/mongod –fork // –fork表示后台运行

Mongo Shell

Mongo Shell是一个JavaScript解释器
数据层次:仓库database -> 集合collection -> [子集合] -> 文档document -> 键值对
打开shell,不连接仓库:mongo –nodb
连接仓库:mongo IP:port/database
执行脚本:mongo IP:port/database script1.js

查看当前连接的仓库:db
显示仓库:show dbs
切换仓库:use db1
显示集合:show collections
引用集合:db.collection1
新增文档:db.collection1.insert(obj)、db.collection1.batchInsert([])
查看一个集合所有的文档:db.collection1.find()
查找一个文档:db.collection1.findOne({a:1}) // 找到 a为1的文档
更新文档:db.collection1.update({a:1}, newObj) // 更新 a为1的文档
删除文档:db.collection1.remove({a:1}) // 删除 a为1的文档
清空集合:db.collection1.drop();
保存文档:db.collection1.save(obj) // obj里有_id
_id:插入文档时未指定_id,则会自动生成一个_id,值为ObjectId对象
ObjectId:时间戳 + 主机名 + PID + 自增计数
打印到控制台:print(1)

修改器(部分更新文档)
db.collection1.update(条件, {$set: {a:1}}) // 设置一个指定字段
db.collection1.update(条件, {$set: {a:1}}, true) // 没找到目标,则新增新文档
db.collection1.update(条件, {$set: {a:1}}, false, true) // 第四个参数表示更新所有匹配的文档,默认只更新一个
db.collection1.update(条件, {$inc: {a:2}}) // 给指定字段加2
db.collection1.update(条件, {$push: {a:2}}) // 给指定数组添加元素
db.collection1.update(条件, {$addToSet: {a:2}}) // 给指定数组添加元素,忽略重复
db.collection1.update(条件, {$pull: {a:2}}) // 给指定数组剔除元素
db.collection1.update(条件, {$push: {a:{$each:[1,2]}}}) // 给指定数组添加多个元素
db.collection1.update({comments.author: “John”}, {$set: {comments.$.author: “Jim”}}) // comments数组中,author为John的元素,author改为Jim

查询
db.collection1.find({}, {username:1}) // 只返回指定字段
db.colection1.find({age:{$gte:18, $lt: 30}}) // [18,30)
db.colection1.find({age:{$in:[1,2,3]}}) // 在数组范围内,另有$nin
db.colection1.find({age:{$or:[age: 1, b: 2]}}) // 或
db.colection1.find({age:{$not: {age: 1}}) // 非
db.collection1.find({username:/dd/}) // 正则匹配
db.collection1.find({fruits: “apple”}) // fruits数组中包含apple
db.collection1.find({fruits:{$all:[“apple”,”banana”]}}) // fruits数组中包含apple 和 banana
db.collection1.find({}, {fruits:{$slice: 10}}) // 只返回指定数组的前10个元素
cursor = db.collection1.find().limit(10).sort(age: 1) // 限制条数,排序,返回的是一个游标

索引

默认索引:_id
db.collection1.getIndexes() // 查看索引
db.collection1.ensureIndex({age: 1}) // 单键索引
db.collection1.ensureIndex({x: 1,y:1}) // 复合索引,与两个单键索引不同
db.collection1.ensureIndex({x: “text”}) // 全文索引,不支持中文
db.collection1.ensureIndex({“$**”: “text”}) // 全文档全文索引
db.collection1.ensureIndex({age: 1}, {unique: true}) // 唯一索引,不允许插入age重复的文档
db.collection1.ensureIndex({age: 1}, {unique: true, sparse: true}) // 稀疏索引,允许有多个文档的同一字段值为null
db.collection1.ensureIndex({age: 1}, {name: “myIndex”}) // 指定索引名称
db.collection1.find().explain().millis // 显示命令解释,显示执行耗时
db.collection1.dropIndex(“age”) // 去掉索引

db.collection1.find({《MongoDB --- 文档型NoSQL》search:”aa bb”}}) // 全文索引查询 aa 或 bb
db.collection1.find({《MongoDB --- 文档型NoSQL》search:”aa bb”}},{score:{《MongoDB --- 文档型NoSQL》meta:”textScore”}}) // 相似度排序

db.collection1.ensureIndex({location: “2d”}) // 平面地理位置索引,location的格式为 [经度,维度]
db.collection1.find({location:{《MongoDB --- 文档型NoSQL》maxDistance:10}}) // 查询离[1,1]距离小于10的点
db.collection1.find({location:{《MongoDB --- 文档型NoSQL》box:[[1,1],[2,2]]}}}) // 查询矩形范围内的点
db.collection1.find({location:{《MongoDB --- 文档型NoSQL》center:[[1,1], 2]}}}) // 查询圆形范围内的点

js 脚本

连接仓库:db = connect(ip:port/db)
显示db:db.getMongo().getDBs()
切换db:db.getSisterDB(“db1”)
显示集合:db.getCollectionNames()
执行Linux命令:run(“pwd”)

副本集

oplog:记录着每一次写操作
大多数原则:存活节点 小于等于 总节点的一半时,如果主节点存活,那么降级为从节点,且不再选举,停止写入服务

初始化步骤:
1、启动各节点(奇数个):mongod –replSet cluster1 –fork // cluster1为副本集群名称
2、连接任一节点
3、初始化副本集

rs.initiate({
    _id: "cluster1",   // 副本集名称
    members: [     // 各节点
         {_id: 0, host: "ip/port"},
         {_id: 1, host: "ip/port"},
         {_id: 2, host: "ip/port"}
    ]
})

添加节点: rs.add(“ip/port”)
移除节点:rs.remove(“ip/port”)
查看配置:rs.config()
重新配置:rs.reconfig(obj)

分片

角色:配置服务器(保存数据分布信息)、路由mongos、分片副本集

初始化步骤:
1、启动3台配置服务器:mongod –configSvr
默认端口为27019,默认数据目录为 /data/configdb
可以跟其他进程在同一个机子上
2、启动多台mongos:mongos –configdb ip:port,ip:port,ip:port // 指定配置服务器地址
可以跟应用程序部署在同一台机子上
3、连接mongos,添加分片(副本集)
> sh.addShard(“ip:port,ip:port,ip:port”); // 指定副本集群的节点地址列表
4、启用分片
> db.enableSharding(“db1”)
> sh.shardCollection(“db1.collection1”,{“name”:1}) // collection1根据name字段(片键)进行分片

查看集群信息:sh.status()

状态

db.currentOp() // 查看当前操作的进度
db.killOp() // 停止当前操作
db.stats() // 仓库状态
db.collection1.stats() // 集合状态
db.shutdownServer() // 停机
db.getProfilingStatus() // 慢查询设置

查看状态:用 mongoStat 连接 mongod

配置

YAML格式

systemLog:
   destination: file
   path: "/var/log/mongodb/mongod.log"
   logAppend: true
storage:
   journal:                    # redo 日志
      enabled: true     
processManagement:
   fork: true
net:
   bindIp: 127.0.0.1
   port: 27017
setParameter:
   enableLocalhostAuthBypass: false

启动时指定配置文件:mongod –config D:/mongodb/mongod.conf

日志

系统日志:mongod -logpath=’/data/db/log/server.log’ -logappend
Journal日志:mongod -journal # journal日志默认开启,在数据目录中
Oplog主从日志:mongod -oplogSize=1024 // 单位为M
慢查询日志:mongod –profile=1 –slowms=5 // 记录超过5秒的操作

阿里云

云数据库 MongoDB版

    原文作者:saoraozhe3hao
    原文地址: https://www.jianshu.com/p/48f1e5c9b052
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞