mongodb命令行操作教程

本文档详细介绍了MongoDB在Mac和服务器上的启动、停止及配置,包括日志和数据目录。此外,还涵盖了数据库的基本操作,如创建、查询、更新和删除,以及集合的管理。进一步讨论了查询技巧,如比较运算符、范围运算符、逻辑运算符、正则表达式以及聚合函数。还涉及索引的创建和使用,以提高查询性能。
摘要由CSDN通过智能技术生成

mongodb教程


mac操作

 1. 前台启动:mongod --config /usr/local/etc/mongod.conf
 2. 后台启动:brew services start mongodb-community
 3. 后台停止:brew services stop mongodb-community
 4. 配置文件:/usr/local/etc/mongod.conf
 5. 日志目录:/usr/local/var/log/mongodb
 6. 数据目录:/usr/local/var/mongodb

服务端操作

1. 查看帮助:mongod --help
2. 启动:sudo service mongod start
3. 停止:sudo service mongod stop
4. 重启:sudo service mongod restart
5. 查看是否启动成功:ps ajx|grep mongod
6. 配置文件位置:/etc/mongod.conf
7. 默认端口:27017
8. 日志的位置:/var/log/mongodb/mongod.log

数据库操作

查看所有数据库
    show dbs
查看当前所属数据库
    db 
切换数据库或创建数据库(存在则切换,不存在则创建)
    use 数据库名 
删除数据库
    db.dropDatabase()

关于集合的基础命令

不手动创建集合:
    向不存在的集合中第一次加入数据时,集合会被创建出来
手动创建集合:
    db.createCollection(name, options)
    db.createCollection("stu")
    db.createCollection("stb", {capped:true, size:10})
    参数crapped:默认值为false表示不设置上限,值为true表示设置上限
    参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,                      
    会将之前的数据覆盖,单位为字节
查看集合:
    show collections
删除结合:
    db.集合名称.drop()

注意点

每个文档都有一个属性,为 _id ,保证每个文档的唯一性
可以自己去设置_id插入文档,如果没有提供,那么MongodDB为每个文档提供一个独特的_id,类型为objectID
objectID是一个12字节的十六进制数(了解一下):
    1. 前4个字节为当前的时间戳
    2. 接下来3个字节为极其的ID
    3. 接下来的2个字节为MongoDB的服务进程id
    4. 最后3个字节是简单的增量值

插入

db.集合名称.insert(document)
db.stu.insert({name:'zhangsan', gender:1})
db.stu.insert({_id:"20170101", name:'zhangsan', gender:1})
插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的Objectid

保存

db.集合名称.save(document)
如果文档的_id已经存在则修改,如果文档的_id不存在则添加

查询

方法 find() 查询全部
    db.集合名称.find({条件文档})
    db.stu.find({name:'zhangsan'})
方法 findOne() 查询只返回一个
    db.集合名称.findOne({条件文档})
    db.stu.findOne({age:20})
方法 pretty() 将结果格式化
    db.集合名称.find({条件文档}).pretty()
    db.stu.find({name:'zhangsan'}).pretty()

更新

db.集合名称.update(<query>,<update>,{multi:<boolean>})
    1. 参数query:查询条件
    2. 参数update:更新操作符
    3. 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
    db.stu.update({name:'zhangsan', {name:'wangwu'}}) 更新匹配的第一条,其他值会被删除
    db.stu.update({name:'zhangsan', {$set:{name:'hys'}}}) 更新匹配的第一条,其他值不会被删除
    db.stu.update{{}, {$set:{gender:0}}, {multi:true}} 跟新全部,其他值不会被删除
注意:"multi update only works with $ operators"

删除

db.集合名称.remove(<query>, {justOne:<boolean>})
    1. 参数query:可选,删除文档的条件
    2. 参数justOne:可选,如果设为true或1,则只删除一条,默认为false,表示删除多条
db.stu.remove({name:'wangwu'}, {justOne:true}) 删除一条
db.stu.remove({gender:2}) 删除全部

比较运算符

等于:默认是等于判断,没有运算符
小于:$lt (less than)
小于等于:$lte (less than equal)
大于:$gt (greater than)
大于等于:$gte (greater than equal)
不等于:$ne (not equal)
db.stu.find({age: {$gte:18}})

范围运算符

使用 "$in", "$nin" 判断是否在某个范围内
查询年龄为18、28的学生
db.stu.find({age:{$in:[18,28]}})

逻辑运算符

and:在json中写多个条件即可
    查询年龄大于或等于18,并且性别为1的学生
    db.stu.find({age:{$gte:18}, sex:1})
or:使用 "$or" ,值为数组,数组中每个元素为json
    查询年龄大于18,或性别为1的学生
    db.stu.find({$or:[{age:{$gt:18}}, {sex:1}]})
    查询年龄大于18,或性别为1的学生,并且姓名是xiaoming
    db.stu.find({$or:[{age:{$gt:18}}, {set:1}],name:'xiaoming'})

支持正则表达式

使用 // 或 $regex 编写正则表达式
查询姓小的学生
db.stu.find({name:/^xiao/})
db.stu.find({name:{$regex:'^xiao'}})

limit和skip()

方法limit():用于读取指定数量的文档
    db.集合名称.find().limit(number)
    查询2条学生信息
    db.stu.find().limit(2)
方法skip():用于跳过指定数量的文档
    db.集合名称.find().skip(number)
    db.stu.find().skip(2)
同时使用
db.stu.find().limit(1).skip(2)
db.stu.find().limit(2).skip(1)

自定义查询

使用 $where 后面写一个函数,返回满足条件的数据
查询年龄大于20的学生
db.stu.find({$where:function(){
 return this.age>20;
}})

投影

在查询的返回结果中,只选择必要的字段
db.集合名称.find({},{字段名称:1,...})
参数为字段与值,值为1表示显示,值为0不变
特殊:对于_id列默认是显示的,如果不显示需要明确设置为0
db.stu.find({},{name:1})
db.stu.find({},{name:1,_id:0})

排序

方法 sort() 用于对集合进行排列
db.集合名称.find().sort({字段:1,...})
参数 1 为升序排列
参数 -1 位降序排列
根据性别降序,再根据年龄升序
db.stu.find().sort({sex:-1,age:1})

统计个数

方法 count() 用于统计结果集中文档条数
db.集合名称.find({条件}).count()
db.集合名称.count({条件})
db.stu.find({sex:1}).count()
db.stu.count({age:{$gt:20},sex:1})

消除重复

方法 distinct() 对数据进行去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('sex', {age: {$gt:18}})

数据的备份

备份的语法
    mongodump -h dbhost -d dbname -o dbdirectory
-h:服务器地址,也可以指定端口号
-d:需要备份的数据库名称
-o:备份的数据存放位置,此目录中存放着备份出来的数据
mongodump -h 127.0.0.1:27017 -d test -o /Users/linbin/Desktop/test

数据的恢复

恢复语法
    mongorestore -h dbhost -d dbname --dir dbdirectory
-h:服务器地址,也可以指定端口号
-d:需要恢复的数据库名称
-o:备份的数据所在的位置
mongorestore -h 127.0.0.1:27017 -d test2 --dir /Users/linbin/Desktop/test/test

聚合函数操作

常用管道
在mongodb中,文档处理完毕后,通过管道进行下一次处理
常用的管道如下:
$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:讲输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档。并返回余下的文档
$unwind:将数组类型的字段进行拆分
表达式
处理输入文档并输出
语法:表达式:'$列名'
常用表达式:
$sum:计算总和, $sum:1 表示以一倍计算
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据
$group
将集合中的文档分组,可用于统计结果
_id表示分组的依据,使用某个字段的格式为'$字段'
统计地区总数
db.map.aggregate(
    {$group:{_id: '$country',counter: {$sum:1}}}
)
将集合中所有文档分为一组:求学生的总人数和平均年龄
db.stu.aggregate(
    {$group:{_id: null , counter: {$sum:1},age_avg: {$avg: '$age'}}}
)
$project
修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
查询学生的姓名、年龄
db.stu.aggregate(
   {$project:{_id:0,name:1,age:1}}
)
查询男生、女生人数,输出人数
db.stu.aggregate(
   {$group:{_id:'$sex',counter:{$sum:1}}},
   {$project:{_id:0, sex:'$_id',counter:1}}
)
$match
用于过去数据,只输出符合条件的文档
查询年龄大于20的学生
db.stu.aggregate(
   {$match:{age:{$gt:20}}}
)
查询你哪里大于20的男生、女生总数
db.stu.aggregate(
   {$match:{age:{$gt:20}}},
   {$group:{_id:'$sex', counter:{$sum:1}}}
)
$sort
将输入文档排序后输出
查询学生信息,并按年龄升序
db.stu.aggregate(
    {$sort:{age:1}}
)
按照性别分类并按人数降序
db.stu.aggregate(
    {$group:{_id:'$sex',count:{$sum:1}}},
    {$sort:{count:-1}},
    {$project:{count:1,_id:0}})
$limit
限制聚合管道返回的文档数
查询2条学生信息
db.stu.aggregate(
   {$limit:2}
)
$skip
跳过指定数量的文档,并返回余下的文档
查询从第2条开始的学生信息
db.stu.aggregate(
   {$skip:2}
)
$unwind
将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
语法:db.集合名称.aggregate({$unwind:'$字段名称'})
db.t2.insert(
   {_id:1, item:'t-shirt', size:['S', 'M', 'L']}
)
db.t2.aggregate(
   {$unwind:'$size'}
)
注意:如果每条文档中含有该数组的字段值为空的时候,想保留字段内容,可以使用:
db.t2.aggregate(
   {$unwind:{
       path: '$字段名称',
       preserveNullAndEmptyArrays:<boolean>  # 防止数据丢失
   }}
)
聚合函数注意点
1. `$group`对应的字典中有几个键,结果中就有几个键
2. 分组依据需要方法哦`_id`后面
3. 取不同的字段的值需要使用$,`$sex`,`$age`
4. 取字典嵌套的字典中的值的时候`$_id.字段`
5. 能够同时按照多个建进行分组
   {$group:{_id:{字段1:"字段1", 字段2:"字段2" ...}}}
   结果是:{_id:{字段1:"", 字段2:"" ...}

索引

索引:以提升查询速度
测试:插入10万条数据到数据库中
for(i=0;i<100000;i++){db.t1.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')

在默认情况下索引字段的值可以相同
创建唯一索引(索引的值是唯一的):
db.t1.ensureIndex({'name':1}, {'unique':true})
建立联合索引(什么时候需要联合索引):
db.t1.ensureIndex({name:1,age:1})
查看当前集合的所有索引:
db.t1.getIndexes()
删除索引:
db.t1.dropIndex({'索引名称':1})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水镜先生在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值