Mongodb 基本操作

2019-02-09  本文已影响0人  姓高名旭升

Mongodb的特点:

基本操作

SQL属于/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

三元素:数据库、集合、文档

1.不能是空字符串("")。
2.不得含有' '(空格)、.、[图片上传失败...(image-5a78e2-1549697942656)]

6). 文档:就是一个对象,由键值对构成,是json的扩展Bson(可以理解为在JSON的基础上添加了一些json中没有的数据类型)形式。 需要注意的是:

1.文档中的键/值对是有序的。
2.文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3.MongoDB区分类型和大小写。
4.MongoDB的文档不能有重复的键。
5.文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

1.键不能含有\0 (空字符)。这个字符用来表示键的结尾。

  1. .和$有特别的意义,只有在特定环境下才能使用。

启动MongoDB

启动MongoDB服务

sudo service mongod start

sudo service mongod stop

sudo service mongod restop

mongo

exit 或 ctrl+c

MongoDB的基本操作

db

show dbs

use 数据库名称

db.stats()

db:当前数据库的名字。
collections:当前数据库的集合数。
objects:当前数据库所有集合总所包含的对象
(即文档)的数量。
avgObjSize:每个文档的平均大小(以字节
为单位)。
dataSize:此数据库中保存的未压缩数据的
总大小,不是指占有磁盘大小,单位是bytes。
storageSize:分配给此数据库的集合用于
存储文档的空间总量,也就是当前数据库占
有磁盘大小,单位是bytes。
numExtents:当前数据库所有集合包含的
扩展数量的统计。
indexes:数据库中包含的所有集合的索引
总数,也就是system.indexes表数据行数。
indexSize:此数据库上创建的所有索引的
总大小,单位是bytes。

db.dropDatabase()

集合的相关操作

db.createCollection(name, options)

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值.当文档达到上限时,会将之前的数据覆盖,单位为字节。如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

db.createCollection("stu")

参数capped:默认值为false表示不设置上限,值为
true表示设置上限
参数size:当capped值为true时,需要指定此参数
,表示上限大小,当文档达到上限时,会将之前的数
据覆盖,单位为字节

db.createCollection(
"sub",
{

capped : true,
size : 10
}
)

db.createCollection(
"sub",
{
capped : true,
size : 10 ,
max:100
}
)

show collections:当前数据库的集合数。

db.集合名称.drop()
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false

文档

文档是一组键值对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
再次对比关系型数据库与非关系型数据库的相关术语: 下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )

MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。

数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于嵌入式的文档,即一个值为一个文档
Null 用于创建空值。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。

ObjectId

ObjectId 类似唯一主键,可以很快的去生成和排序

插入文档

db.集合名称.insert(document)

注意:插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId*

db.stu.insert(
{name:'xxx',gender:1}
)

db.stu.insert(
{
_id:'20201226',
name:'xxxx',gender:1
}
)

db.stu.insert(
[
{name:'王明',gender:1},
{name:'王玲玲',gender:0}
]
)

在3.2版本之后还提供了插入多条数据和插入单条数据的方法

db.集合名称.insertOne(document)
db.集合名称.insertMany(document)

查询全部文档

db.集合名称.find()

更新文档

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。两个函数是有区别的。

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
}
)

参数说明

db.stu.update(
{name:'xxxxx'},
{name:'张xxx'}
)

例2:指定属性更新,通过操作符$set

db.stu.insert(
{name:'李自成',gender:1}
)
db.stu.update(
{name:'李自成'},
{
$set:{name:'闯王李自成'}
}
)

例4:修改多条匹配到的数据(跟新所有name为‘李自成’的文档的dender字段)

db.stu.update(
{name:'李自成'},
{
$set:{gender:0}
},
{multi:true}
)

db.集合名称.save(document)
db.stu.save(
{
_id:'20180820101010',
'name':'跟新'
}
)

pretty()

该函数,将数据以格式化的方式展示

db.集合名称.find().pretty()

db.collection.remove(
<query>,
{justOne: <boolean>,}
)

参数说明

db.集合名称.remove(document)

db.集合名称.remove(
document,1
)
db.集合名称.remove(
document,
{justOne:true}
)

db.集合名称.remove({})基本的数据查询
db.集合名称.find({条件文档})

db.集合名称.findOne({条件文档})

db.stu.find({name:'李某某'})
db.stu.findOne({name:'李某某'})比较运算符

db.stu.find({age:{$gte:18}})

逻辑运算符

查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
逻辑与:默认是逻辑与的关系
例:查询年龄大于或等于18,并且性别为1的学生

db.stu.find(
{
age:{$gte:18},
gender:1
}
)

逻辑或:使用$or

例4:查询年龄大于18,或性别为0的学生

db.stu.find(
{
[图片上传失败...(image-16b3f6-1549697942655)]

gt:18}},
{gender:1}
]
}
)

and和or一起使用

例5:查询年龄大于18或性别为0的学生,并且学生的姓名为gj

db.stu.find(
{
[图片上传失败...(image-22b084-1549697942655)]

gte:18}},
{gender:1}
],
name:'gj'
}
)


范围运算符

使用"[图片上传失败...(image-274450-1549697942659)]

nin" 判断是否在某个范围内 例:查询年龄为18、28的学生

db.stu.find(
{
age:{$in:[18,28]}
}
)

支持正则表达式

使用//或$regex编写正则表达式 例:查询姓李的学生

db.stu.find(
{name:/^李/}
)
db.stu.find(
{
name:{$regex:'^李'}
}
)

$type

想要获取某一中类型的数据 例如:如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:

db.col.find(
{
"title" : {$type : 'string'}
}
)

Limit与Skip方法

db.集合名称.find().limit(num)

db.集合名称.find().skip(num)

limit() 方法、Skip() 方法 同时使用,不分先后顺序 表示跳过多少条,返回多少条
查询第5至8条数据

db.stu.find().limit(4).skip(5)
db.stu.find().skip(5).limit(4)

sort() 方法排序

**sort() **方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

db.集合名称.find().sort({排序字段:1})

db.集合名称.find().sort({排序字段:-1})

根据多个字段排序: 例:先根据年龄做降序,再根据性别做升序

db.集合名称.find().sort({age:-1,gender:1})

注意: skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。

distinct() 去重

db.集合名称.distinct('去重字段',{条件})

例:查找年龄大于20的姓名(去重)

db.集合名称.distinct('name',{age:{$gt:20}})
project投影(可以指定想要返回的字段)
在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段
参数为字段与值,值为1表示显示,值为0不显示
db.集合名称.find({},{字段名称:0,...})

count() 统计个数

db.集合名称.count({条件})

db.集合名称.find().count()
db.集合名称.find({条件}).count()

db.集合名称.count(
{
age:{$gt:20},
gender:1})

MongoDB的聚合

aggregate() 方法

MongoDB中聚合的方法使用aggregate() 语法
aggregate() 方法的基本语法格式如下所示:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

管道的概念

$group:将集合中的文档分组,可用于统计结果。
$project:修改输入文档的结构。可以用来重命名、增加或
删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档,$match使用MongoDB的标准查询操作。

$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文
档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条
包含数组中的一个值。
$sort:将输入文档排序后输出。
$sum: 计算总和
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$count:计算总数
$push:插入一个值到元组
$first:排序获取第一个文档数据
$last:排序获取最后一个文档数据

管理员权限

创建超级管理用户

use admindb.createUser({   user:'admin',pwd:'123',roles:[{role:'root',db:'admin'}]})

启用安全认证

新版本 注意:keys and values之间一定要加空格, 否则解析会报错

security:
  authorization: enabled

低版本

或者修改配置文件将auth=true前面的注释拿掉然后保存并退出

修改普通用户权限或密码

db.updateUser(‘ljh',{pwd:'456'})

db.grantRolesToUser('username',[{role:'',db:''}])

db.revokeRolesFromUser('username',[{role:'',db:''}])

db.dropUser('username')

use admin db.system.users.remove({user:'username'})

MongoDB 备份(mongodump)

mongodump -h dbhost -d dbname -o dbdirectory

如果没有开启权限

mongodump -h 127.0.0.1:27017 -d 数据库名称 -o ~/Desktop/数据库备份的路径
mongodump -h 127.0.0.1:27017 -o ~/Desktop/数据库备份的路径

如果开启了权限设置(使用超级管理员权限)

我们也可以使用账号密码的方式备份指定用户的数据库
设置了超级管理员也可以使用如下方法备份

mongodump -u username -p password --authenticationDatabase 'admin' -d dbname -o dbpath

恢复备份

mongodb使用 mongorestore 命令来恢复备份的数据。

mongorestore -h hostname:port -d dbname --dir path

如果没有开启权限

mongorestore -h 127.0.0.1:27017 -d 数据库名称 --dir 数据库备份文件路径
mongorestore -h 127.0.0.1 -dir 数据库备份文件路径

下面是我添加了管理员权限之后的备份命令如果开启了权限设置(使用超级管理员权限)

mongorestore -u username -p password --authenticationDatabase 'admin' -d 数据库名称 --dir 数据库备份文件路径

MongoDB数据导入与导出导出工具:

mongoexport

mongoexport -d dbname -c collectionname -o file --type json/csv -f field

参数说明:

导出json

mongoexport -d class1804 -c books -o ~/桌面/dump/books.json --type json

导出csv

mongoexport -d class1804 -c books -o ~/桌面/dump/books.csv --type csv -f 'by_user,likes'数据导入:

mongoimport

mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv

参数说明:

mongoimport -d class1712B -c books --file ~/桌面/dump/books --type json

导入csv

mongoimport -d class1712B -c info --file ~/桌面/dump/books --headerline --type csv

什么是复制

复制的工作原理

直接使用主从复制局限

(1)主从复制在master宕机后,没有自动选举master机制,导致主节点服务一挂,便不能对外提供增删改操作。
(2)所有增删改操作都是针对主节点进行操作,可能导致主节点性能下降。
(3)从节点对主节点的数据都是全量拷贝,对主从节点的压力都是不小的。

复制的特点

上一篇下一篇

猜你喜欢

热点阅读