乐趣区

关于mongodb:MongoDB部署集合文档索引的基本操作

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 su
    sudo yum install libcurl openssl
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.2.tgz
    tar -xvf mongodb-linux-x86_64-rhel70-5.0.2.tgz
    mv 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 information
    destination: file
    #mongo 或 mongos 应向发送所有诊断日志记录信息的日志文件门路
    path: "/mongodb/single/log/mongod.log"
    #当 mongos 或 mongod 实例重新启动时,mongos 或 mongod 会将新条目附加到现有日志文件的开端
    logAppend: true
    storage:
    #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: true
    processManagement:
    #启用在后盾运行 mongos 或 mongod 过程的守护过程模式
    fork: true
    net:
    #服务实例绑定的 IP,默认是 localhost
    bindIp: localhost,172.19.18.168
    #bindIP 局域网 IP - ifconfig
    #绑定端口,默认为 27017
    port: 27017

    备用

    # 数据库门路
    dbpath=/mongodb/single/data/db
    
    #日志输入文件门路
    logpath=/mongodb/single/log/mongod.log
    
    #谬误日志采纳追加模式
    logappend=true
    
    #启用日志文件,默认启用
    journal=true
    
    #这个选项能够过滤掉一些无用的日志信息,若须要调试应用请设置为 false
    quiet=true
    
    #端口号 默认为 27017
    port=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:$PATH
    mongod -f /mongodb/single/mongod.config
    #设置明码
    mongo
    use admin
    db.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

    敞开服务

    # 形式 1
    kill -2 过程号
    #形式 2
    pkill 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:"叫学姐"})
#部分的批改 - $set
db.comment.update({useid:"10"},{$set:{content:"学姐再见"}})
#批量批改 - multi:true 批改所有符合条件的数据
db.comment.update({useid:"10"},{$set:{content:"学姐再见"}},{multi:true})
#列值增长的批改 - $inc
db.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 比拟查问

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

# > 的应用 $gt
db.collectionName.find({字段:{$gt: 值}})
# < 的应用 $lt
db.collectionName.find({字段:{$lt: 值}})
# >= 的应用 $gte
db.collectionName.find({字段:{$gte: 值}})
# <= 的应用 $lte
db.collectionName.find({字段:{$lte: 值}})
# != 的应用 $ne
db.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 的文档,仅返回 likenum
    db.comment.createIndex({likenum:1})
    db.comment.find({likenum:{$gt:10}},{likenum:1,_id:0}).expalin()

    查问条件与返回的后果仅只有 likennum,间接在 likenum 索引里遍历即可,不必遍历文档

退出移动版