MnongoDB的安装及常用命令

mongodb的安装

我们这里只讲如何在ubuntu虚拟机中安装

一、mongoDB的安装

  1. ubuntu
sudo apt-get install -y mongodb-org

这里的-y 参数是所有安装过程中的yes选项,全部默认是yes,省去我们手动输入的操作。

  1. 其他linux:
    tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
  • 移动到/use=r/local/目录下
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
  • 将可执行文件添加到PATH路径中
export PATH=/usr/local/mongodb/bin:$PATH

二、服务端启动

查看帮助:

mongod –help

启动:

sudo service mongod start

停止:

sudo service mongod stop

重启:

sudo service mongod restart

查看是否启动成功:

ps ajx|grep mongod

配置文件的位置:

    /etc/mongod.conf, 

默认端⼝:

    27017

日志的位置:

/var/log/mongodb/mongod.log

三、客户端

启动本地客户端:

mongo

查看帮助:

mongo –help

退出:

exit
或者
ctrl+c

四、数据库常用命令

  1. 关于database的基础命令:
  • 查看当前的数据库:
        db
  • 查看所有的数据库:
show dbs  /show databases
  • 切换数据库:
use db_name
  • 删除当前的数据库:
db.dropDatabase()
  1. 关于集合的基础命令:

    • 不手动创建集合:

    向不存在的集合中第一次加入数据时, 集合会被创建出来

    • 手动创建结合:
db.createCollection(name,options)
db.createCollection("stu")
db.createCollection("sub", { capped : true, size : 10 } )
# 参数capped: 默认值为false表示不设置上限,值为true表示设置上限
# 参数size: 当capped值为true时, 需要指定此参数, 表示上限大小,当文档达到上限时, 会将之前的数据覆盖, 单位为字节
  • 查看集合:
show collections
  • 删除集合:
db.集合名称.drop()
  1. 数据类型
  • Object ID: 文档ID

  • String: 字符串, 最常用, 必须是有效的UTF-8

  • Boolean: 存储一个布尔值, true或false

  • Integer: 整数可以是32位或64位, 这取决于服务器

  • Double: 存储浮点值

  • Arrays: 数组或列表, 多个值存储到一个键

  • Object: 用于嵌入式的⽂档, 即一个值为一个文档

  • Null: 存储Null值

  • Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数

  • Date: 存储当前⽇期或时间的UNIX时间格式

    注意点:

  • 创建日期语句如下 :参数的格式为YYYY-MM-DD
  • new Date('2017-12-20')
  • 每个文档都有一个属性, 为_id, 保证每个文档的唯一性
  • 可以自己去设置_id插入文档,如果没有提供, 那么MongoDB为每个文档提供了一个独特的_id, 类型为objectID
  • objectID是⼀个12字节的十六进制数:
  • 前4个字节为当前时间戳
  • 接下来3个字节的机器ID
  • 接下来的2个字节中MongoDB的服务进程id
  • 最后3个字节是简单的增量值
  1. 插入
  • db.集合名称.insert(document)
db.集合名称.insert({name:'tom',gender:1})
db.集合名称..insert({_id:"20180101",name:'tom',gender:1})
  • 插入文档时, 如果不指定_id参数, MongoDB会为文档分配一个唯一的ObjectId
  • insert插入时,如果包括_id参数在内的所有参数的值都存在,且插入的document与存在的都相同,则会抛出一个异常。
  1. 保存
db.集合名称.save(document)
  • 如果文档的_id已经存在则修改, 如果文档的_id不存在则添加

五、查询(*****)

  1. 简单查询:
db.集合名称.find()
  1. 更新:
db.集合名称.update(<query> ,<update>,{multi: <boolean>})
  • 参数query:查询条件
  • 参数update:更新操作符
  • 参数multi:可选, 默认是false,表示只更新找到的第一条记录, 值为true表示把满足条件的文档全部更新 例如:
db.stu.update({name:'hr'},{name:'mnc'})   # 更新一条
db.stu.update({name:'hr'},{$set:{name:'hys'}})    # 更新一条
db.stu.update({},{$set:{gender:0}},{multi:true})   # 更新全部
  1. 删除:
db.集合名称.remove(<query>,{justOne: <boolean>})
  • 参数query:可选,删除的文档的条件
  • 参数justOne:可选, 如果设为true或1, 则只删除一条, 默认false, 表示删除多条
  1. 数据查询
  • find(): 查询
     db.集合名称.find({条件文档})
  • findOne():查询,只返回第一个
    db.集合名称.findOne({条件文档})
  • pretty(): 将结果格式化
db.集合名称.find({条件文档}).pretty()
  1. 比较运算符
  • 等于: 默认是等于判断, 没有运算符
  • 小于:$lt (less than)
  • 小于等于:$lte (less than equal)
  • 大于:$gt (greater than)
  • 大于等于:$gte
  • 不等于:$ne 栗子:
db.stu.find({age:{$gte:18}})
  1. 逻辑运算符
  • and:在json中写多个条件即可
  • 查询年龄大于或等于18, 并且性别为true的人
 db.stu.find({age:{$gte:18},gender:true})
  • or:使用$or, 值为数组, 数组中每个元素为json
  • 查询年龄大于18, 或性别为false的人
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
  • 查询年龄大于18或性别为男, 并且姓名是tom
db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'tom'})
  1. 范围运算符:
  • 使用"$in", "$nin" 判断是否在某个范围内
  • 查询年龄为18、 28的人
db.stu.find({age:{$in:[18,28]}})
  1. 支持正则表达式
  • 使用//或$regex编写正则表达式
  • 查询姓“黄”的人
db.stu.find({name:/^黄/})
或
db.stu.find({name:{$regex:'^黄'}})
  1. limit和skip
  • limit(): 用于读取指定数量的文档
db.集合名称.find().limit(number)
  • 查询2条信息
db.集合名称.find().limit(2)
  • skip(): 用于跳过指定数量的文档
db.集合名称.find().skip(number)
db.集合名称.find().skip(2)
  • 同时使用: 实际使用中,我们经常会配合使用。
db.集合名称.find().limit(4).skip(5)
或 
db.集合名称.find().skip(5).limit(4)
  1. 自定义查询*(支持js)
  • 使用$where后面写一个函数, 返回满足条件的数据
  • 查询年龄大于30的
db.集合名称.find({
    $where:function() {
        return this.age>30;}
})
  1. 投影
  • 在查询到的返回结果中, 只选择必要的字段
  • db.集合名称.find({},{字段名称:1,...})
  • 参数为字段与值, 值为1表示显示, 值为0不显
  • 特殊: 对于_id列默认是显示的, 如果不显示需要明确设置为0
db.集合名称.find({},{_id:0,name:1,gender:1})
  1. 排序 sort(), 用于排序
db.集合名称.find().sort({字段:1,...})
  • 参数1为升序排列
  • 参数-1为降序排列
  • 根据性别降序, 再根据年龄升序
db.集合名称.find().sort({gender:-1,age:1})
  1. 统计个数
  • count(): 统计结果集中文档条数
  • db.集合名称.find({条件}).count()
    • 实际使用中,我们一般使用第一种更符合逻辑。
  • db.集合名称.count({条件})
db.集合名称.find({gender:true}).count()
db.集合名称.count({age:{$gt:20},gender:true})
  1. 消除重复
  • distinct()对数据进行去重
  • db.集合名称.distinct('去重字段',{条件})
db.集合名称.distinct('hometown',{age:{$gt:18}})

六、查询之聚合查询

聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。

db.集合名称.aggregate({管道:{表达式}})
  1. 常用管道 在mongodb中,文档处理完毕后, 通过管道进行下一次处理
    常用管道如下:
  • $group: 将集合中的⽂档分组, 可⽤于统计结果
  • $match: 过滤数据, 只输出符合条件的⽂档
  • $project: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
  • $sort: 将输⼊⽂档排序后输出
  • $limit: 限制聚合管道返回的⽂档数
  • $skip: 跳过指定数量的⽂档, 并返回余下的⽂档
  • $unwind: 将数组类型的字段进⾏拆分
  1. 表达式 处理输入文档并输出
语法:表达式:'$列名'
##### 常用表达式:
  • $sum: 计算总和, $sum:1 表示以一倍计数
  • $avg: 计算平均值
  • $min: 获取最小值
  • $max: 获取最大值
  • $push: 在结果文档中插入值到一个数组中
  • $first: 根据资源⽂档的排序获取第一个文档数据
  • $last: 根据资源⽂档的排序获取最后一个文档数据
  1. 聚合之$group
  • 将集合中的文档分组,可用于统计结果
  • _id表示分组的一句,使用某个字段的格式为"$字段"
  • 栗子: 统计男、女的总数
db.集合名称.aggregate(
        {$group:
                {_id: "$gender", counter:{$sum:1}}
        }
)

group文档连接

  1. Group by null
  • 将集合中所有文档分为一组
  • 栗子:求总人数,平均年龄
db.集合名称.aggregate(
        {$group:
                {_id:null, counter:{$sum:1}, avgAge:{$avg:"$age"}}
        }
)
  1. 透视数据
  • 统计不同性别人的姓名
db.集合名称.aggregate(
        {$group:{_id:"$gender", name:{$push:"$name"}}}
)
  1. match
  • 用于过滤数据,只输入符合条件的文档
  • 使用mongodb的标准查询操作
  • 栗子:查询年龄大于20的人
db.集合名称.aggregate(
        {$match:{age:{$gt:20}}}
)
  • 栗子2:查询年龄大于20的男、女人数
db.集合名称.aggregate(
        {$match:{age:{$gt:20}}},{$group:{_id:"gender", counter:{$sum:1}}}
)
  1. $project
  • 修改输入文档的结构,如:重命名、增加、删除字段、创建计算结果
  • 栗子:查询姓名、年龄;只显示查询的字段数据,不显示_id字段
db.集合名称.aggregate(
        {$project:{_id:0, name:1, age:1}}
)
  • 栗子2:查询男、女人数,只输出人数,其他不输出。
db.集合名称.aggtegate(
        {$group:{_id:"$gender"}, counter:{$sum:1}},
        {$projectL{_id:0, counter:1}}
)
  1. $sort
  • 排序: 不多做解释了。直接上栗子
  • 栗子:查询男、女人数,按人数降序排列
db.集合名称.aggregate(
        {$group:{_id:"$gender", counter:{$sum:1}}},
        {$sort:{counter:-1}}
)
  1. $limit与$skip
  • $limit: 限制聚合管道返回的文档数量
  • 栗子:查询2条信息
db.集合名称.aggregate({$limit:2})
  • $skip: 跳过指定数量文档,并返回剩下的文档内容
  • 栗子:查询从第三条开始的信息
db.集合名称。aggregate({$skip:2})
  • 联合使用
  • 统计男、女人数,按人数升序排列】,取第二条数据
db.集合名称.aggregate(
        {$group:{_id:"$gender", counter:{$sum:1}}},
        {$sort:{counter:1}},
        {$skip:1},
        {$limit:1}
)

这里需要注意下,一定要先跳:skip,再取:limit

七、MongoDB之索引的创建

  • 索引:以提升查询速度

  • 测试:插入10万条数据到数据库中

for(i=0;i<100000;i++){db.t12.insert({name:'test'+i,age:i})}

db.t1.find({name:'test10000'})
db.t1.find({name:'test10000'}).explain('executionStats')
  • 建立索引之后对比:

  • 语法:

db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序
  • 具体操作:
    db.t1.ensureIndex({name:1})
db.t1.find({name:'test10000'}).explain('executionStats')

比较两次查询的速度

八、数据的备份和恢复

备份的语法:

mongodump -h dbhost -d dbname -o dbdirectory
  • -h: 服务器地址, 也可以指定端⼝号
  • -d: 需要备份的数据库名称
  • -o: 备份的数据存放位置, 此目录中存放着备份出来的数据
  • 栗子:
mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak

恢复语法:

mongorestore -h dbhost -d dbname --dir dbdirectory
  • -h: 服务器地址
  • -d: 需要恢复的数据库实例
  • --dir: 备份数据所在位置
  • 栗子:
mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1

转载于:https://my.oschina.net/u/3826227/blog/1797544

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值