美文网首页
MongoDB --- 文档型NoSQL

MongoDB --- 文档型NoSQL

作者: saoraozhe3hao | 来源:发表于2018-10-17 15:59 被阅读0次

    历史:美国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({text:{search:"aa bb"}}) // 全文索引查询 aa 或 bb
    db.collection1.find({text:{search:"aa bb"}},{score:{meta:"textScore"}}).sort({score:{meta:"textScore"}}) // 相似度排序

    db.collection1.ensureIndex({location: "2d"}) // 平面地理位置索引,location的格式为 [经度,维度]
    db.collection1.find({location:{near:[1,1],maxDistance:10}}) // 查询离[1,1]距离小于10的点
    db.collection1.find({location:{geoWithin: {box:[[1,1],[2,2]]}}}) // 查询矩形范围内的点
    db.collection1.find({location:{geoWithin: {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版

    相关文章

      网友评论

          本文标题:MongoDB --- 文档型NoSQL

          本文链接:https://www.haomeiwen.com/subject/eyjrzftx.html