热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

MongoDB安装及常用语句总结

目录MongoDB介绍MongoDB安装在线安装离线安装启动MongoDB命令行启动配置文件启动停止MongoDB访问MongoDB数据库命令用户管理角色管理安全认证集合文档索引使

目录



  • MongoDB介绍

  • MongoDB安装

    • 在线安装

    • 离线安装



  • 启动MongoDB

    • 命令行启动

    • 配置文件启动



  • 停止MongoDB

  • 访问MongoDB

    • 数据库命令

      • 用户管理

      • 角色管理

      • 安全认证

      • 集合

      • 文档

      • 索引

      • 使用SQL查询

      • 备份/恢复

      • 导入/导出






MongoDB介绍

MongoDB是免费开源的跨平台NoSQL数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案,MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似JSON的二进制形式的存储格式,称为BSON,和JSON一样支持内嵌的文档对象和数组对象,因此可以存储比较复杂的数据类型

MongoDB与关系型数据库类似,关系如下















































SQLMongoDB说明
数据库(database)数据库(database)最外层概念,可理解为小区的名字,小区内包含多栋楼(集合)
表(table)集合(collection)可理解为小区中的每栋楼,一栋楼包含许多家的房间(文档)
行(row)文档(document)可理解为屋子中的各个房间(具体数据),并非通常理解的PDF、Word等文档
列(column)字段(field)可理解为各个房间的名称
索引(index)索引(index)独立的检索式数据结构,可理解为如何查找各个房间
主键(primary key)_id(字段)各个文档中多有唯一的_id字段,可理解为各个房间的编号
表连接(join,……)聚合操作($lookup,……)对集合中的文档进行各类操作,可理解为对各栋楼中的房间进行分组、排序等

MongoDB安装

进入MongoDB社区版下载页面,选择版本、平台及包格式后下载,可点击【Copy Link】复制链接后用wget命令在线下载安装包


在线安装

wget https://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/x86_64/RPMS/mongodb-org-server-6.0.0-1.el8.x86_64.rpm # 下载
rpm -ivh mongodb-org-server-6.0.0-1.el8.x86_64.rpm # 安装

此方式可以直接使用命令systemctl start/status/stop/restart/enable/disble mongod.service等管理MongoDB状态

允许远程连接,需在/etc/mongod.conf文件中将第29行bindIp设置为要连接的IP地址,或者允许所有人连接,改为0.0.0.0

也可是使用下文离线安装中介绍的方式管理MongoDB状态,注意:使用离线模式启动后再使用systemctl命令会报错,后续只能使用mongod命令管理状态


离线安装

下载MongoDB时,选择tgz格式的包,上传到服务器,然后执行以下命令

tar -zxf mongodb-linux-x86_64-rhel80-6.0.0.tgz # 解压
mv mongodb-linux-x86_64-rhel80-6.0.0 /usr/local/mongodb # 移动到/usr/local/目录并重命名为mongodb
cd /usr/local/mongodb # 进入mongodb目录
mkdir -p data/db # 创建data/db目录,在db中存放数据文件
mkdir logs && cd logs && touch mongodb.log && cd .. # 创建logs目录并在此目录下创建mongodb.log文件,然后返回

启动MongoDB


命令行启动

bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork


  • --dbpath:指定数据文件的存放目录



  • --logpath:指定日志文件



  • --logappend:使用追加方式记录日志



  • --port:指定端口,默认是27017



  • --bind_ip:绑定访问IP,默认只能本机访问



  • --fork:后台方式运行,无此参数则前台运行



  • --auth:以安全认证的方式启动,访问数据库前需完成身份认证



更多参数请使用bin/mongod -h查看帮助


配置文件启动

因为命令太长,所以可以改为配置文件的方式启动,创建文件并根据需要将参数写入文件中,比如:在etc目录下创建文件vim /etc/mongodb.conf,并输入以下内容,文件具体参数信息请根据实际所需进行修改,使用配置文件启动时后面可继续跟其它参数

dbpath=/usr/local/mongodb/data/db # 数据文件存放目录
logpath=/usr/local/mongodb/logs/mongodb.log # 日志文件存放目录
bind_ip=0.0.0.0 # 不限制访问IP,允许所有人连接
port=27017 # 使用默认端口
logappend=True # 以追加方式记录日志
fork=True # 后台守护进程方式运行

bin/mongod -f /etc/mongodb.conf # 启动MongoDB服务

环境配置

因为每次都要进入MongoDB安装目录才能执行命令,所以可将其配置到环境变量中,打开配置文件vim /etc/profile,添加以下信息

export MONGODB_HOME=/usr/local/mongodb # 根据实际安装路径修改
export PATH=$PATH:$MONGODB_HOME/bin

重新加载环境变量source /etc/profile后,就可以直接使用命令啦


停止MongoDB

在命令后加参数--shutdown,如mongod -f /etc/mongodb.conf --shutdown

进入数据库后关闭,命令为db.shutdownServer()db.adminCommand({ shutdown: 1 })


访问MongoDB

命令访问

此方式需要安装基于Javascript开发的MongoDB Shell工具,Linux系统下载对应版本的rpm包,安装后即可使用,Windows系统下载后可以将bin目录路径配置到环境变量中,否则只能在安装目录运行,默认连接本地MongoDB,可以使用参数连接其它数据库,如下所示:

mongosh -u dyd -p 123456 --port 27017 --host 192.166.66.24 admin # 带身份认证信息连接指定数据库

MongoDB Shell常用命令







































































































命令解释说明
db.auth()使用账号密码完成身份认证
db.version()查看数据库版本
db.help()查看当前数据库支持的方法
use 数据库名切换数据库,若不存在则创建数据库
db.createCollection()创建集合,名称必填,可选参数请查看官方介绍
show tables查看当前数据库集合列表
db.集合名.insertOne()插入单条文档
db.集合名.insertMany()插入多条文档
db.集合名.updateOne()更新单条文档,还可使用replaceOne更新单条数据
db.集合名.updateMany()更新多条文档
db.集合名.deleteOne()删除单条文档
db.集合名.deleteMany()删除多条文档
db.集合名.find()查询集合内容,无查询条件则显示全部
db.集合名.countDocuments()统计文档条目,无查询条件时统计全部数据
db.集合名.stats()查看集合详情
db.集合名.drop()删除集合
show users查看当前数据库所有用户
show roles查看当前数据库所有角色
load("***.js")执行一个Javascript脚本文件
db.runCommand({})在当前数据库运行命令
db.adminCommand({})在admin数据库运行命令
db.dropDatabase()删除数据库
exit退出当前Shell

可视化工具

工具有很多,比如:Studio 3T、Navicat、MongoDB Compass等,不多做介绍啦


数据库命令

以下介绍为常用命令,更多命令请查看官方文档


用户管理

首先以普通方式启动MongoDB

mongod -f /etc/mongod.conf


  1. 创建用户

    use admin # 切换到admin库中
    db.createUser({ # 创建名为dyd的用户,赋予admin库超级管理员权限
    user: "dyd",
    pwd: passwordPrompt(), # 提示输入密码,历史命令中不会显示设定的密码
    roles: [{role: "root",db: "admin"}]})

    或者不切换数据库,使用db.runCommand()命令创建用户

    db.adminCommand({ # 创建名为myTest的用户,赋予local库可读写权限,admin库只读权限
    createUser: "myTest",
    pwd: "123456", # 直接明文设定密码
    roles: [ { role: "readWriteAnyDatabase", db: "admin" },{ role: "read", db: "local" } ]})


  2. 更新用户

    db.runCommand({ # 更新用户信息
    updateUser: "dyd",
    pwd: passwordPrompt(),
    roles: [
    { role: "read", db: "admin" },{ role: "readWrite", db: "test" }],
    comment: "更新了用户密码、数据库角色权限"
    })


  3. 获取用户信息

    db.getUser("dyd") # 查找用户
    db.runCommand({usersInfo: { user: "dyd", db: "admin" },showPrivileges: true}) # 获取指定用户信息
    show users # 查看当前数据库中所有用户


  4. 赋予用户角色及其权限

    db.runCommand({ # 给当前数据库中的用户添加权限
    grantRolesToUser: "dyd",
    roles: ["userAdmin","dbAdmin"],
    comment: "给dyd用户多加两个角色"
    })


  5. 撤销用户绑定的角色及其权限

    db.adminCommand({ # 因为readWriteAnyDatabase角色必须在admin库下操作,所以命令使用adminCommand()
    grantRolesToUser: "myTest",
    roles: [{ role: "readWriteAnyDatabase", db: "admin" },{ role: "read", db: "local" }],
    comment: "撤销dyd用户的两个角色"
    })


  6. 修改用户密码

    db.changeUserPassword("dyd", "654321")


  7. 删除用户

    db.dropUser("admin")



角色管理

以下为常用内置角色,也可以自定义角色,更多角色介绍及操作请查看官方介绍























































内置角色权限说明
read允许读取指定数据库
readWrite允许读写指定数据库
dbAdmin允许在指定数据库中执行管理函数,如访问system.profile资源,创建、查看、删除集合等
userAdmin允许在指定数据库中创建、查看、删除用户和角色等
dbOwner赋予用户当前数据库的所有者权限,此角色集合了readWrite、dbAdmin和userAdmin角色的权限
clusterAdmin集群管理权限,此角色集合了clusterManager、clusterMonitor、hostManager以及dropDatabase角色的权限,必须在admin数据库下操作
readAnyDatabase允许用户读取所有数据库,必须在admin数据库下操作
readWriteAnyDatabase允许用户读写所有数据库,必须在admin数据库下操作
userAdminAnyDatabase赋予用户对所有数据库的userAdmin角色中的权限,必须在admin数据库下操作
dbAdminAnyDatabase赋予用户对所有数据库的dbAdmin角色中的权限,必须在admin数据库下操作
root超级管理权限,必须在admin数据库下操作


  1. 赋予用户角色

    # 赋予dyd用户对admin库的userAdminAnyDatabase角色
    db.grantRolesToUser("dyd",[{ role: "userAdminAnyDatabase", db: "admin"}])


  2. 撤销用户角色

    # 撤销dyd用户对admin库的root角色
    db.revokeRolesFromUser("dyd",[{ role: "root", db: "admin"}])


  3. 获取角色信息

    db.getRole("read",{showPrivileges: true}) # 查找角色及对应权限
    db.runCommand({ rolesInfo: "read" }) # 获取当前数据库使用的角色
    db.runCommand({ rolesInfo: { role: "read", db: "test" } }) # 获取指定数据库使用read的角色
    db.runCommand({ rolesInfo: [{ role: "read", db: "test" },{ role: "readWrite", db: "admin" }]}) # 多个角色信息



安全认证

以安全认证方式启动MongoDB

mongod -f /etc/mongod.conf --shutdown # 先停止MongoDB服务
mongod -f /etc/mongod.conf --auth # 以安全认证的方式启动,访问数据库需要身份认证

认证方式有两种



  1. 带认证信息连接对应数据库,认证信息不正确,或数据库和认证信息不对应,都会报MongoServerError: Authentication failed.

    mongosh -u dyd -p 123456 --port 27017 --host 192.166.66.24 admin # 带身份认证信息连接指定数据库


  2. 先连接默认数据库,再进行认证后切换到有权操作的数据库

    mongosh --port 27017 --host 192.166.66.24 # 连接默认数据库test

    完成身份认证

    db.auth("myTest", "123456") # 进行身份认证,成功则返回1


退出认证

db.logout() # 退出身份认证
db.runCommand({logout:1}) # 或者使用命令

MongoDB以认证方式运行时各类操作都需要相应权限,可能会经常出现MongoServerError: command usersInfo requires authenticationAuthentication failed,所以操作前请确认当前用户所拥有的权限


集合


  1. 创建集合

    db.createCollection("dydCL") # 创建名为dydCL的集合
    db.createCollection("dydCL",{capped:true,size:1024},{max:100}) # 创建固定大小的集合,且最多可包含100条数据

    当集合不存在时,直接插入数据也会创建集合

    db.ydCL.insertOne({name:"dyd",age:18}) # ydCL集合不存在,插入数据时会先自动创建ydCL集合


  2. 删除集合

    db.ydCL.drop() # 删除名为ydCL的集合



文档


  1. 插入文档

    db.ydCL.insertOne({name:"dyd",age:18}) # 直接在ydCL集合中插入一条数据
    db.ydCL.insertMany([{name:"dyd1",age:19},{name:"dyd2",age:20}]) # 直接在ydCL集合中插入两条数据

    准备如下两条数据

    data0 = {"_id":1,name:"test",age:21,"hobbies":["旅游","游戏"],"skills":{"languages":["Chinese","English"]}}
    data1 = {"_id":2,name:"段",age:22,"hobbies":["乒乓球","游戏"],"skills":{"languages":["Chinese","French"]}}

    通过读取数据插入到集合中

    db.dydcoll.insertOne(data0) # 将data0中的数据插入到ydCL集合中
    db.dydcoll.insertMany([data0,data1]) # # 将data0和data1中的数据插入到ydCL集合中

    通过load()加载js脚本生成并导入数据

    准备js脚本,比如创建testData.js

    let names = ["段雨晗","张珊","李思","王武","老六","吴琦"]
    let hobbies = ["旅游","游泳","打篮球","打乒乓球","看电影"]
    let languages = ["Python","Java","Javascript","Go","PHP"]
    let Info = []
    for(let i=0;i<10;i++){
    let nameIdx = Math.floor(Math.random()*names.length)
    let hobbyIdx = Math.floor(Math.random()*hobbies.length)
    let languageIdx = Math.floor(Math.random()*languages.length)
    let levels = Math.floor(Math.random()*50)
    let ages = 10 + Math.floor(Math.random()*20)
    let info = {
    name:names[nameIdx],
    age:ages,
    hobby:hobbies[hobbyIdx],
    language:languages[languageIdx],
    level:levels,
    account:{user:"dyd"+nameIdx,pwd:"1234"+ages,level:levels}
    }
    Info.push(info)
    }
    db.ydCL.insertMany(Info)

    进入MongoDB Shell,执行一个js文件

    load("testData.js") # 执行js文件,生成10条数据
    db.ydCL.find() # 查看生成的数据


  2. 查询文档

    db.ydCL.find() # 查询ydCL集合中所有数据
    db.ydCL.findOne() # 查询ydCL集合中第一条数据
    db.ydCL.find().sort({age:-1}) # 排序,查询结果根据age降序排列,1表示升序排列
    db.ydCL.find().skip(0).limit(5) # 分页查询,从第1条数据开始查,每页显示5条数据
    db.ydCL.find({name:/^段/}) # 使用正则表达式查询,查询name包含“段”的数据
    db.ydCL.distinct("name") # 去重显示name字段所有的值

    条件查询

    查询条件经常会用到运算,在MongoDB中与MySQL中不同,不能使用><等符号,需要用聚合管道操作符,下面简单介绍一下常用的操作符,其它操作符使用时多查看官方介绍吧























































    操作符解释说明
    $eq相等,如:{age:{$eq:18}},亦可写{age:18},请根据实际查询语句做选择
    $gt大于,如:age:{$ge:18}}
    $gte大于等于,如:age:{$gte:18}}
    $lt小于,如:age:{$lt:18}}
    $lte小于等于,如:age:{$lte:18}}
    $ne不相等,如:age:{$ne:18}}
    $and与运算,如:{$and:[{name:"dyd"},{age:17}]}
    $nor非运算,如:{$nor:[{name:"dyd"},{age:17}]}
    $or或运算,如:{$or:[{name:"dyd"},{age:17}]}
    $in成员运算,如:{"age":{$in:[18,19,20]}}
    $type返回指定数据类型的文档,类型可以用数字表示,如:2表示string,10表示null,16表示int等,举例:{age:{$type:16}}

    db.ydCL.find({name:"段雨晗"}) # 查找name为“段雨晗”的数据
    db.ydCL.find({name:"李思",age:{$gt:18}}) #查找name为“李思”且age大于18的数据
    db.ydCL.findOne({name:"老六",age:{$lte:20}}) #查找name为“老六”且age小于等于18的数据结果中的第一个结果
    db.ydCL.find({$and:[{name:"王武"},{age:17}]}) # 查找name为“王武”以及age等于17的数据
    db.ydCL.find({$nor:[{name:"张珊"},{age:{$gt:20}}]}) # 查找name为“张珊”或者age大于17的数据
    db.ydCL.find({"name":{$in:["张珊","李思","王武"]}}) # 查找包含指定成员的数据
    db.ydCL.find({age:{$type:"string"}}) # 查看age是字符串类型的数据

    投影

    上文查询结果会将所有字段展示出来,且默认展示_id字段,要限制展示全部字段信息,需要设置字段列表值为1或0,1表示显示该字段,0表示隐藏该字段

    db.ydCL.find({hobby:"游泳"},{_id:0,name:1}) # 查询hobby为“游泳”的数据,只展示name
    db.ydCL.find({age:{$gt:15}},{_id:0,name:1,language:1}) # 查询age大于15的数据,只展示name和language字段的值


  3. 更新文档

    使用update更新时需要更新操作符,常用的更新操作符如下,更多信息请查看官方介绍































































    操作符解释说明
    $currentDate将字段的值设置为当前日期,可以是日期或时间戳
    $inc对数值类型字段进行增减
    $min当指定值小于现有字段值时才更新
    $max当指定值大于现有字段值时才更新
    $mul将字段的值乘以指定的数量
    $rename修改字段名称,其实质是将查询结果重旧字段下移到新字段下
    $set设置文档中字段的值,若不存在则进行创建
    $unset从文档中删除指定的字段
    $addToSet仅当集合中不存在元素时,将元素添加到数组中,若元素存在,则不添加,具有排重功能
    $pop删除数组的第一项或最后一项
    $pull删除与指定查询匹配的所有数组元素
    $push将数组追加到数组,若数组不存在则会进行初始化
    $pullAll从数组中删除所有匹配的值

    db.ydCL.updateOne({_id:2},{$set:{name:"李四"}}) # 更新id为2的name为“李四”
    db.ydCL.updateOne({_id:3},{$set:{name:"zhangsan"}},{upsert:true}) # upsert表示若数据不存在则插入到集合中
    db.ydCL.updateMany({age:22},{$pop:{hobbies:-1}}) # 更新删除年龄为22的第最后一项,1表示删除第一项
    db.ydCL.findOneAndUpdate({age:{$eq:5}},{$set:{hobby:"购物"}})# 查找age等于5的用户并将hobby改为“购物”,默认返回旧数据
    # ↓更新id为3的文档,replace不能使用操作符,文档内容必须包含全部字段信息,不包含字段内容会被置空
    db.ydCL.replaceOne({_id:3},{name:"张三",age:18,hobby:"篮球"}})
    db.ydCL.findOneAndReplace({age:5},{name:"李斯",age:19,hobby:"购物",language:"Go",author:"dyd-1"})


  4. 删除文档

    db.ydCL.deleteOne({name:"张三"}) # 删除name为“张三”的数据,如果有多条则只删除第一条
    db.ydCL.deleteMany({name:"王武"}) # 删除所有name为“王武”的数据
    db.ydCL.deleteMany({name:"老六"},{age:{$gte:60}}) # 删除所有name为“老六”且age大于等于60的数据
    db.ydCL.findOneAndDelete({_id:ObjectId("62e8ea7135f956a18f9b002e")}) # 查找后删除


  5. 聚合操作

    聚合操作是用于处理数据并返回计算结果的,比如比较运算、最大值、最小值、平均值、求和、分组、排序等,用于查询和更新数据,聚合操作可以对分组数据执行各种操作以返回预期结果,聚合操作分三类:单一作用聚合、聚合管道、MapReduce



    • 单一作用聚合:对单个集合进行聚合文档操作,比如:db.CL.distinct()db.CL.countDocuments()

    • 聚合管道:一个数据聚合计算框架,可以作用在一个或多个集合上,可对集合中的数据进行一系列运算后将数据转为期望形式进行展示,这个聚合过程称为管道(Pipeline),由多个阶段(Stage)组成,每个管道接受一系列文档(即原始数据),每个阶段会对这些文档进行一系列的运算,然后将运算后的结果文档输出给下一个阶段,直到聚合完成输出最终结果

    • MapReduce:处理每个文档并向输入文档发送一个或多个对象的map阶段及reduce组合map操作的输出阶段,直接看官方介绍吧

    上文介绍了聚合管道操作符,下面介绍一下聚合管道阶段,二者都属于聚合操作,聚合管道阶段是在db.collection.aggregate()方法中使用的,如下为常用聚合管道阶段,其它管道阶段请查看官方介绍















































    阶段解释说明
    $project重塑文档,类似MySQL中的as
    $match设置筛选条件,类似MySQL中的where
    $sort排序,-1表示降序,1表示升序,类似MySQL中的order by
    $group分组,类似MySQL中的group by,只是在MongoDB中group只返回统计结果,所以常结合运算操作符使用
    $lookup左外连接另一个集合,类似MySQL中的left outer join
    $count返回最终结果数,类似MySQL中的count函数
    $skip指定查询结果从哪条记录开始显示,常和$limit一起用
    $limit主要用于指定查询结果显示多少条数据,与$skip一起时,类似于MySQL中的limit
    $unwind拆分数组,解构一个数组字段并输出每个元素

    db.ydCL.aggregate() # 参数为空时和find()操作一样,会查询所有数据
    db.ydCL.aggregate([{$project:{_id:0,"姓名":"$name"}}]) # 查询所有name,字段名设为“姓名”
    db.ydCL.aggregate([{$project:{语言:"$name",_id:0,"account.level":1}}]) # 查询name及嵌套文档中的level
    db.ydCL.aggregate([{$project:{_id:0,"账号":{"用户名":"$account.user","显示":1}}}]) # 查询并只显示嵌套文档中的user
    db.ydCL.aggregate([{$match:{age:{$lt:25}}},{$count:"age"}]) # 统计age小于25的数量
    db.ydCL.aggregate([{$match:{age:{$gt:15}}},{$sort:{age:-1}}]) # 查找age大于15的数据并降序排列
    db.ydCL.aggregate([{$skip:2},{$limit:4}]) # 分页展示,从第三条数据开始查询,每页显示4条数据
    db.dydcoll.aggregate([{$unwind:"$skills.languages"}]) # 拆分skills.languages数组,并输出对应的数据
    # 集合ydCL与集合dydcoll根据name完成左外连接
    db.ydCL.aggregate([{$lookup:{from:"dydcoll",localField:"name",foreignField:"name",as:"测试"}}])
    # 查询name分组,统计同名数量,对应账号等级以及平均年龄
    db.ydCL.aggregate([{$group:{_id:"$name",总数:{$sum:1},等级:{$max:"$account.level"},平均年龄:{$avg:"$age"}}}])

    常用的$concat$substrCPtoLowertoUppertoStringtoInt等,至少要包含一个聚合管道阶段

    db.ydCL.aggregate([{$project:{_id:0,"拼接":{$concat:["$name","-","$account.user"]}}}]) # 拼接两个字段
    db.ydCL.aggregate([{$project:{_id:0,"截取":{$substrCP:["$name",0,1]}}}]) # 截取name字段中的姓氏
    db.ydCL.aggregate([{$project:{_id:0,"转大写":{$toUpper:"$account.user"}}}]) # 嵌套文档中的user转大写
    # 将age小于20的language字段的值转为小写
    db.ydCL.aggregate([{$match:{age:{$lte:20}}},{$project:{_id:0,"转小写":{$toLower:["$language"]}}}])



索引

MongoDB在集合级别定义索引,默认创建_id字段作为唯一索引,MongoDB中的索引与其他数据库系统中的索引类似,详细了解请查看官方介绍



  1. 创建索引

    # 将name创建为唯一索引,1表示升序索引,-1表示降序索引,sparse表示索引引用指定字段的文档,设置索引有效期,索引名为“nameIdx”
    db.dydcoll.createIndex({"name":1}, {unique:true,sparse:true,expireAfterSeconds:3600,name:"nameIdx"})


  2. 查看索引

    db.dydcoll.getIndexes()


  3. 删除索引

    db.dydcoll.dropIndex("nameIdx") # 删除指定索引
    db.dydcoll.dropIndexex() # 删除全部索引



使用SQL查询

可使用Studio 3T管理工具编写SQL语句查询MongoDB数据,如下示例

db.ydCL.find() # 查询所有数据
db.ydCL.find({"account.user":"dyd5"},{_id:0,name:1}) # 查询嵌套文档中user为dyd5的name
db.ydCL.find({"age":{$in:[17,19,21]}}) # 查询age等于17,19,21的数据
db.ydCL.aggregate([{$match:{age:{$lte:25}}},{$count:"age"}]) # 查询age小于等于25的数据总条数
# 查询名字和平均年龄,根据name分组,并根据平均年龄降序排列
db.ydCL.aggregate([{$group:{_id:"$name",avgAge:{$avg:"$age"}}},{$sort:{avgAge:-1}}])

以上MongoDB语句对应的SQL语句如下所示,常用MySQL语句总结请查看此文章

select * from ydCL;
select name from ydCL where account.user = "dyd5";
select * from ydCL where age in (17,19,21);
select count(age) from ydCL where age <= 25;
select name,avg(age) from ydCL group by name order by avg(age) desc;

备份/恢复

进入Database-Tools页面,选择版本、平台及包格式,下载安装工具,详细使用方法请查看官方介绍

wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.5.4.rpm # 下载
rpm -ivh mongodb-database-tools-rhel80-x86_64-100.5.4.rpm # 安装


  1. 数据备份

    # 备份数据test数据库及用户凭据admin数据库到opt目录下
    mongodump -h 192.166.66.24:27017 -o /opt -u dyd -p 123456 --authenticatiOnDatabase=test


    • -h:数据库地址

    • -o:备份存放位置

    • -u:用户名,需要身份认证时使用

    • -p:密码,需要身份认证时使用

    • -d:需要备份的数据库,仅备份指定的数据库

    • --authenticationDatabase:需要备份的数据库,同时保存用户凭据的数据库(即admin库)和指定的数据库



  2. 数据恢复

    # 重opt目录下恢复数据到test数据库下的ydCL集合中,同时恢复用户凭据到admin库
    mongorestore --nsInclude=test.ydCL /opt/ -u dyd -p 123456 --authenticatiOnDatabase=test


    • --nsInclude:指定要恢复数据的集合




导入/导出

支持导入导出jsoncsv格式的文件



  1. 数据导出

    # 导出test数据库中ydCL集合的数据到opt目录下,命名为ydCL_bak.json
    mongoexport -h 192.166.66.24:27017 -c ydCL -o /opt/ydCL_bak.json -u dyd -p 123456 -d test


  2. 数据导入

    # 导入ydCL_bak.json文件中的数据到test数据库中的dydcol集合
    mongoimport -h 192.166.66.24:27017 /opt/ydCL_bak.json -c dydcol -u dyd -p 123456 -d test


MongoDB版本更新后命令有增删改,不同版本命令可能存在差异,以上命令都有在6.0版本执行过,文中也未详细介绍命令可选参数,所以使用时请多查看官方文档,文中多处已附官方文档相关介绍外链,多使用--help命令和tab键补全功能



推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • step1.为mongodb添加admin管理员root@12.154.29.163:~#mongoMongoDBshellversionv3.4.2connectingto:mo ... [详细]
  • 今天我们学习,数据库mongodb的使用,最下面有mongodb的下载链接。pipinstallpymongo首先安装pymongo,然后在需要用到的地方importpymongo ... [详细]
  • MongoDB学习:(二)MongoDB简单使用
    MongoDB学习:(二)MongoDB简单使用MongoDB使用:执行mongodb的操作之前,我们需要运行命令,来进入操作命令界面&amp;amp;gt;mongo提示 ... [详细]
  • mongoDB高可用集群环境搭建
    2019独角兽企业重金招聘Python工程师标准在生产环境下,部署一台mongodb服务的话,会存在以下问题:单点问题生产环境是一个 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了Mongodb副本集+分片集群搭建相关的知识,希望对你有一定的参考价值。环境需求: ... [详细]
  • 前面刚有AWS开战MongoDB,双方“隔空互呛”,这厢又曝出2亿+简历信息泄露——MongoDB的这场开年似乎“充实”得过分了些。长期以来,作为“最受欢迎的NoSQL数据库”,M ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
author-avatar
摩擦摩擦魔鬼的步伐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有