MongDB入门

官网下载地址

  1. 部署
  2. 数据库、汇合、文档的基本操作
  3. 索引

1 单机部署

  1. 下载、解压、配置
  2. 启动数据库
  3. 连贯数据库

1.1 Windows下启动

下载后解压至本地
在解压后文件里创立一个目录用于存储数据文件 data/db

形式1:命令行参数形式启动服务

在bin目录中执行如下命令:

mongod --dbpath=..\data\db

默认端口27017,能够通过port指定端口

能够将bin目录设置到环境变量path中,方便使用一些命令

形式2:配置文件形式启动服务
新建config文件夹,在文件夹下新建配置文件mongod.config

storage:  #The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.  dbPath: F:\mongodb-5.0.2\data\db

在bin下执行

mongod -f ../config/mongod.config或mongod --config ../config/mogod.config
默认端口27017
在部署我的项目时,应用这种办法,有具体的参数

1.2连贯数据库

1.2.1 Shell连贯(mongo命令)

在bin下新关上一个shell窗口
连贯

mongo或mongo --host=localhost --port=27017

查已有数据库

>show databases

退出mongodb

exit

更多参数

mongo --help
MongoDB javascript shell 是一个基于JavaScript的解释器,反对js程序

1.2.2 Compass图形化界面的应用

下载地址抉择社区版
填入ip与端口号 间接连贯即可

1.3 Linux下启动与连贯数据库

将下载的linux版本的MongoDB拷贝到服务器

  1. 下载、解压、挪动

    sudo susudo yum install libcurl opensslwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.2.tgztar -xvf mongodb-linux-x86_64-rhel70-5.0.2.tgzmv mongodb-linux-x86_64-rhel70-5.0.2 /usr/local/mongodb
  2. 新建目录,存储数据和日志

    #数据存储mkdir -p /mongodb/single/data/db#日志存储mkdir -p /momgodb/single/log
  3. 新建配置文件

    vi /mongodb/single/mongod.config
  • 配置文件

    systemLog:#MongoDB发送所有日志输入的指标指定文件##The path of the log file to which mongod or mongos should send all diagnostic logging informationdestination: file#mongo或mongos应向发送所有诊断日志记录信息的日志文件门路path: "/mongodb/single/log/mongod.log"#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端logAppend: truestorage:#mongod实例存储数据的目录 storage.dbPath设置仅应用于mongd##The directory where the mongod instance stores its data.Default Value is "/data/db".dbPath: "/mongodb/single/data/db"journal:  #启用或禁止持久性日志以确保数据文件放弃无效和可复原  enabled: trueprocessManagement:#启用在后盾运行mongos或mongod过程的守护过程模式fork: truenet:#服务实例绑定的IP,默认是localhostbindIp: localhost,172.19.18.168#bindIP局域网IP - ifconfig#绑定端口,默认为27017port: 27017

    备用

    #数据库门路dbpath=/mongodb/single/data/db#日志输入文件门路logpath=/mongodb/single/log/mongod.log#谬误日志采纳追加模式logappend=true#启用日志文件,默认启用journal=true#这个选项能够过滤掉一些无用的日志信息,若须要调试应用请设置为falsequiet=true#端口号 默认为27017port=27017#容许近程拜访(服务器局域网ip 用ifconfig查看)bind_ip=localhost,172.19.18.168#开启子过程fork=true#开启认证,必选先增加用户,先不开启(不必验证账号密码)#auth=true
  1. 启动MongoDB服务

    #启动/usr/local/mongodb/bin/mongod -f /mongodb/single/mongod.config或export PATH=/usr/local/mongodb/bin:$PATHmongod -f /mongodb/single/mongod.config#设置明码mongouse admindb.createUser({user:"root",pwd:"password",roles:["root"]})db.auth('root','password')

    能够将export PATH=/usr/local/mongodb/bin:$PATH增加到/etc/profile文件中
    这样不必每次都设置环境变量

    vim /etc/profile增加在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL之后

    设置明码须要在配置中增加 auth = true

  • 通过过程来查看服务是否启动

    ps -ef |grep mongod
  1. Compass连贯服务

    host:公网IP端口:27017

    防火墙开启与敞开

    #查看防火墙转态systemctl status firewalld#长期敞开防火墙systemctl stop firewalld#开启防火墙systemctl start firewalld#开机禁止启动防火墙systemctl disable firewalld#开机启用防火墙systemctl enable firewalld

    增加防火墙端口

    #凋谢端口firewall-cmd --zone=public --add-port=27017/tcp --permanent #防火墙从新加载配置firewall-cmd --reload#查问凋谢的端口firewall-cmd --list-port#敞开一个防火墙端口firewall-cmd --zone=public --remove-port=27017/tcp --permanent

    敞开服务

    #形式1kill -2 过程号#形式2pkill mongod
  • 可能呈现的问题
    启动失败:个别就是配置文件的门路或者短少必要的配置项,或者是启动命令谬误
    连贯失败:如果是云服务器,先查看防火墙规定或平安组是否放行27017端口,这里能够不在shell中操作,间接手动增加。查看配置文件的bindIp,批改为0.0.0.0,或者在localhost后增加内网ip
#本地cmd连贯服务器数据库mongodb/din] mongo --host=外网IP

2 根本常用命令

  1. 数据库的抉择、创立、删除
  2. 汇合的创立与删除
  3. 文档的CRUD

2.1 数据库操作

2.1.1 抉择和创立数据库

#查看有权查看的所有数据库> show dbs> show datadases#抉择或创立一个数据库> use dbname
  • use dbname,dbname存在时则抉择进入该数据库,不存在时创立数据库并进入
  • 默认进入的数据库为test

2.1.2 数据库的删除

#查看以后数据库> db#删除以后数据库> db.dropDatabase()
  • db示意以后数据库,可视为一个对象,下面有很多办法
admin: root,增加一个用户到此数据库,该用户主动继承所有数据库权限。一些特定服务器命令只能从这个数据库运行 - 列出所有数据库或敞开服务器
local:该数据库永远不会被复制,能够用来存储限于本地单台服务器的任意汇合
config:当Mongo用于分片设置时,config数据库在外部应用,用于保留分片的相干信息

2.2汇合操作

2.2.1汇合的显示创立

#显式创立汇合 - 关系数据库中的表db.createCollection(name)#查看汇合show collections

2.2.2汇合的隐式创立

向一个汇合插入一个文档的时候,如果汇合不存在,则会主动创立汇合

举荐应用此办法隐式创立文档

2.2.3 删除一个汇合

#删除汇合db.collectionName.drop()#查看show collections

2.3 文档根本CRUD

2.3.1 文档的插入

  1. 单文档插入
    应用insert()save()办法向汇合插入文档

    db.collectionName.insert( <document or array of document>, {     writeConcern: <document>,     ordered: <boolean> })
    • document 要插入到汇合的文档或文档数组(json格局)
    • writeConern 性能与可靠性的级别
    • ordered 插入时是否排序
    //示例db.comment.insert( {     "articleid":"100",     "content":"针不戳",     "useid":"10",     "nickname":"Jack",     "creatdatetiem":new Date(),     "likenum":NumberInt(10),     "state":null })
  2. 批量插入
    应用inserMany()

    db.collectionName.insertMany( [<document1> , <document2> , ...], {     writeConern:<document>,     ordered:<boolean> })
    //示例db.comment.insertMany([ {     "articleid":"100",     "content":"针不戳",     "useid":"10",     "nickname":"Jack",     "creatdatetiem":new Date(),     "likenum":NumberInt(10),     "state":null }, {     "articleid":"100",     "content":"这垃圾袋挺能藏啊",     "useid":"1",     "nickname":"pig",     "creatdatetiem":new Date(),     "likenum":NumberInt(1000),     "state":null }])

2.3.2 文档的根本查问

应用find()

db.collectionName.find(<query>,[projection])
  • query:可选,应用查问运算符指定筛选范畴
  • projection:可选,指定要在与查问筛选器匹配的文档中返回的字段
#全副查问db.comment.find()#条件查问db.comment.find({"useid":"10"})#单文档条件查问db.comment.findOne({"useid":"10"})#投影查问db.comment.find({"useid":"10"},{"useid":1,"_id":0})
  • 投影查问第一个参数为条件,第二个参数为要显示的数据
插入错误处理,将操作写在try中,catch捕捉谬误并print

2.3.3 文档的更新

应用update()

db.collectionName.update(query,update,options)db.collectionName(    <query>,    <update>,    {        upsert:<boolean>,        nulti:<boolean>,        writeConcern:<document>,        collation:<document>,        arrayFilters:[<filterdocument1>,...],        hint:<document|string>  //MondoDB 4.2     })
#笼罩的批改 - 只保留更新的数据db.comment.update(useid:"1",{content:"叫学姐"})#部分的批改 - $setdb.comment.update({useid:"10"},{$set:{content:"学姐再见"}})#批量批改 - multi:true批改所有符合条件的数据db.comment.update({useid:"10"},{$set:{content:"学姐再见"}},{multi:true})#列值增长的批改 - $incdb.comment.update({useid:"10"},{$inc:{likenum:NumberInt(1)}})
updateOneupdateMany能够别离单条与多条的批改

2.3.4 文档的删除

应用remove()

db.collectionName.remove(条件)
#删除1或多个db.comment.remove({content:"学姐好"})db.comment.remove({useid:"10"})#全副删除db.comment.remove({})
deleteOne与deleteMany能够单条与多条的删除

2.4 文档的分页查问

2.4.1 统计查问

应用count()

db.collectionName.count(query,options)
  • query:查问条件
  • options:可选,批改计数的额定选项
#统计所有记录db.comment.count()#按条件统计记录db.comment.count({likenum:10})

2.4.2 分页列表查问

应用limit()读取指定数量的数据,skip()跳过指定数量的数据

db.collectionName.find().limit(num).skip(num)
#跳过2条显示2条数据db.comment.find().limit(2).skip(2)

2.4.3 排序查问

应用sort() 按某字段升序或降序查问 1为升序,-1位降序

db.collectionName.find().sort({KEY:1})
#对useid升序排列 雷同id按点赞数升序db.comment.find({},{useid:1,likenum1}).sort({useid:1,likenum:1})
尽量保障排序的字符串数据位数雷同
sort排序会从首位比拟

2.5 其余查问形式

2.5.1 正则的简单条件查问

db.collectionName.find({字段:/正则/})
db.comment.find({content:/齐刷的/})

2.5.2 比拟查问

< ,<= ,> ,>= ,!=

# >的应用 $gtdb.collectionName.find({字段:{$gt:值}})# <的应用 $ltdb.collectionName.find({字段:{$lt:值}})# >=的应用 $gtedb.collectionName.find({字段:{$gte:值}})# <=的应用 $ltedb.collectionName.find({字段:{$lte:值}})# !=的应用 $nedb.collectionName.find({字段:{$ne:值}})
#查问点赞数大于两百的数据db.comment.find({likenum:{$gt:200}})

2.5.3 蕴含查问

应用$in

db.colletionName.find({字段:{$in:["val1","val2"]}})
#查找id为1和2的数据db.comment.find({useid:{$in:["1","2"]}})

2.5.4 条件连贯查问

应用$and$or

db.collection.find({$and:[{},{},{}]})db.collection.find({$or:[{},{},{}]})
#查找点赞数大于100小于1000的文档db.comment.find({$and:[{likenum:{$gt:100}},{likenum:{$lt:1000}}]})#查找id为1和2的文档db.comment.find({$or:[{useid:"1"},{useid:"2"}]})

3 索引 - Index

  1. 索引介绍 - 类型与长处
  2. 索引的操作
  3. 索引的性能

3.1 概述

  • MongoDB的索引应用了B-Tree,MySQL是B+Tree,在结构上MySQL反对随机和程序查找
  • 应用B树数据结构遍历结点,结点内应用程序查找或二分查找去查找关键字,查找失败确定范畴到下一级结点,直到查找胜利或返回null
  • 应用索引能够缩小查问的汇合,不必遍历所有的汇合晋升查问效率

3.2 索引类型

3.2.1 单字段索引

  • 在文档的单字段上创立用户定义的升序/降序索引
  • 能够在任何方向上遍历索引

    #升序{userid:1}

3.2.2 复合索引

  • 多个字段的用户定义的索引
  • 先按一个去排序,雷同的值按其余字段再排序

    #按id升序,雷同id按num降序{userid:1,num:-1}

3.2.3 其余索引

  • 天文空间索引
    返回后果时应用平面几何的二维索引
    返回后果时应用球面几何的二维球面索引
  • 文本索引
    反对在搜寻字符串内容,这些文本索引不存储特定语言的进行词,而将几何中的词作为词干,只存储词根
  • 哈希索引
    对字段值的散列进行索引,这些索引在其范畴内的值散布更加随机,但反对相等匹配,不反对基于范畴的查问

3.3 索引的治理操作

3.3.1 查看索引

  • 返回几何中所有索引的数组

    db.collectionName.getIndexes()
    #查问comment几何所有的索引db.comment.getIndexes()[     { v: 2, key: { _id: 1 }, name: '_id_' } ]
    默认以_id为索引

3.3.2 创立索引

  • 在汇合上创立索引

    db.collectionName.createIndex(keys,options)

    keys:键值对文档,键为字段,值为1或-1。也能够是其余索引类型
    options:可选,管制索引创立的选项文档

    unique:<Boolean/> 索引是否惟一
    name:<String/> 索引名称,能够对复合索引重命名
    sparse:<Booeal/> 不存在的字段不启用索引
    weights:<document/> 索引权重值,优先级1-99999
    其余参数可参考文档
    #在comment上增加一个降序的索引db.comment.createIndex({useid:-1})#查看索引db.comment.getIndexes()[    { v: 2, key: { _id: 1 }, name: '_id_' },    { v: 2, key: { useid: -1 }, name: 'useid_-1' }]

3.3.3 删除索引

  • 能够移除指定索引,或删除所有索引

1.指定删除

#删除指定索引db.collectionName.dropIndex(index)
index 能够是name也能够是key
#删除comment汇合的useid字段降序的索引db.comment.dropIndex("useid_-1"){ nIndexesWas: 2, ok: 1 }

2.删除全副

#删除全副索引db.collectionName.dropIndexes()
_id是不会被删除的

3.4 应用索引

3.4.1 执行打算

  • 剖析查问性能通 应用 执行打算来察看查问状况
  • 查问消耗的事件、是否基于索引查问

    db.collectionName.find(query,options).explain(options)
    #查问useid为2的文档db.comment.find({useid:"2"}).explain()
    返回的参数中 WinningPlanstage参数记录了查问的形式,索引还是全局

3.4.2 涵盖的查问

  • 当查问条件和查问投影仅蕴含索引字段时,MongoDB间接从索引返回后果
  • 不扫描任何文档或将文档带入内存

    #查问likenum为大于10的文档,仅返回likenumdb.comment.createIndex({likenum:1})db.comment.find({likenum:{$gt:10}},{likenum:1,_id:0}).expalin()
    查问条件与返回的后果仅只有likennum,间接在likenum索引里遍历即可,不必遍历文档