MongoDB基础知识

一、MongoDB介绍

MongoDB是一个基于分布式文件存储 [1]  的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引
 

二、MongoDB用法

  • 1、MongoDB的增删改查

###########查
切换数据库:use test    注意:当该数据库不存在则会创建一个新的数据库
查看当前数据库:db
查看所有的数据库:show databases(简写dbs)
查看该数据库下的所有集合:show collections(show tables)
查看某个集合的内容:db.collection.find()

###########增
`db.test1.insert({_id:'5f618bd390edf95aa3cc6f81',name:'alex'})`     #注意,当_id已存在时会报错
`db.test1.save({_id:"5f618bd390edf95aa3cc6f81", name:"alex1",age:18})`    # 注意:当_id不存在时则新增,存在则更新

###########删
`db.dropDatabase()`    # 删除当前数据库
`db.test.remove({name:"xiaohong"},{justOne:1})`   #默认删除所有满足条件的数据,使用`{justOne:true}`能达到只删除一条的效果  

###########改
`db.update({name:"xiaowang"},{name:"xiaogang"})`    #把名字为xiaowang的数据替换成{name:"xiaogang"}
`db.test.update({name:"xiaowang"},{$set:{name:"xiaogang"}})`    #把{name:"xiaowang"}的name值更新为{name:"xiaogang"}
`db.test.update({name:"xiaogang"},{$set:{name:"xiaohong"}},{multi:true})`    #`{multi:true}`更新全部
  •  2、MongoDB的高级查询

1、查询符合条件:db.collection.find({条件})    `db.stu.find({city:"深圳"})`

2、查询符合条件的一条数据:db.collection.findOne({条件})    `db.stu.findOne({city:"深圳"})`

3、`pretty()`    结果格式化,使数据更直观    `db.stu.find({city:"深圳"}).pretty()`

4、比较运算符
大于:$gt
小于:$lt
大于等于:$gte
小于等于:$lte
不等于:$ne
`db.stu.find({age:{$lt:20}})`

4、范围运算符:$in
`db.stu.find({age:{$in:[18,19,20]}})` 查询年龄在18-20范围内

5、逻辑运算符
(1)且(and),写多个条件即可
eq:查询年龄为18,并且城市在深圳的学生
`db.stu.find({age:18,city:"深圳"})`
(2)或(or),$or
eq:查询年龄为18或者城市在深圳的学生
db.stu.find({$or:[{age:18},{city:"深圳"}]})

6、正则匹配,$regex
eq:匹配以“小”为开头的名字的学生
`db.stu.find({name:{$regex:"^小"}})`

7、分页查询:limit和skip
eq:查询前两条数据
`db.stu.find().limit(2)`
eq:跳过前两条数据
`db.stu.find().skip(2)`

8、投影,选择返回的字段
eq:只显示姓名
`db.stu.find({age:{$lte:20}},{name:1})`
注意:默认_id会显示出来,`{_id:0}`可以不显示

9、排序:sort
eq:降序
`db.stu.find().sort({age:1})`
eq:升序
`db.stu.find().sort({age:-1})`

10、统计数量:count
eq:统计年龄小于等于20或者城市为深圳的学生格式
方法一:`db.stu.find({$or:[{age:{$lte:20}},{city:"深圳"}]}).count()`
方法二:`db.stu.count({$or:[{age:{$lte:20}},{city:"深圳"}]})`

11、去重:distinct
eq:查询年龄小于等于20的学生的城市
`db.stu.distinct("city",{age:{$lte:20}})`
  • 3.MongoDB的备份和恢复

1、备份mongodump
参数:-h IP地址 
     --port=端口号
     -d 数据库
     -o 备份的目录
eq:mongodump --port=38000 -d test -o ~/

2、恢复mongorestore
mongorestore -h hostip -d dbname --dir dirname
eq:mongorestore -d test -dir ~/test
  • 4.聚合命令

聚合和Linux中的管道一样,即是将上一次的结果传给下一次使用

常用的管道:
$group:分组,可用于统计结果
$match:筛选,只分析符合条件的文档
$project:修改输入的文档,如重命名、增加、删除字段,创建计算结果
$sort
$limit
$skip
  • (1)$group,处理输入的文档并输出

表达式:
1、$sum:求和
eq:统计每个地区的学生个数
`db.stu.aggregate({$group:{_id:"$city",count:{$sum:1}}})`
2、$avg:平均值
eq:统计每个地区的学生的年龄平均值
`db.stu.aggregate(
{$
group:{_id:"$city",avg_age:{$avg:"$age"}}}
)`

eq:统计所有学生的总人数和平均年龄
`db.stu.aggregate(
{$group:{_id:"null",sum:{$sum:1},avg_age:{$avg:"$age"}}}
)`
3、$min:取最小值
4、$max:取最大值
5、$push:在结果文档中插入值到数组中
6、$first:取第一个文档
7、$last:取最后一个文档
  •  (2)$project,修改格式

eq:统计所有学生的总人数和平均年龄,并且将_id这个字段名改为`city`
`db.stu.aggregate(
{$group:{_id:"$city",sum:{$sum:1},avg_age:{$avg:"$age"}}},
{$project:{city:"$_id",sum:1,avg_age:1,_id:0}} )`
  •  (3)$match,筛选条件

eq:按不同的地区统计出年龄大于18岁的学生的人数,平均年龄
`db.stu.aggregate(
{$match:{age:{$gte:18}}},
{$group:{_id:"$city",人数:{$sum:1},平均年龄:{$avg:"$age"}}},
{$project:{_id:0,城市:"$_id",人数:1,平均年龄:1}}
)`
  •  练习:

原数据:

 eq:先去重,再统计每个国家的人数

`db.country.aggregate(

{$group:{_id:{country:"$country",pro:"$pro",name:"$name"}}},

{$group:{_id:{country:"$_id.country"},sum:{$sum:1}}}

)`

 (4)sort,limit,skip的使用

1)sort:排序
eq:按城市进行分组,统计每个城市的学生的平均年龄,并排序
`db.stu.aggregate(
{$group:{_id:"$city",平均年龄:{$avg:"$age"}}},
{$project:{城市:"$_id",_id:0,平均年龄:1}},
{$sort:{平均年龄:1}}
)`


(2)limit:限制
eq:显示前两条数据
`db.stu.aggregate({$limit:2})`

(3)skip
eq:跳过前两条数据
`db.stu.aggregate({$skip:2})`

5.索引操作

建立索引:        
(1)唯一索引:    `db.country.ensureIndex({name:1}{unique:true})`
(2)组合索引:    `db.country.ensureIndex({name:1,country:1})`

查看索引:
`db.country.getIndexes()`

删除索引:
`db.country.ensureIndex({name:1,country:1})`
原文地址:https://www.cnblogs.com/maoxinjueluo/p/13834641.html