MongoDB总结
1.MongoDB
1.1.MongoDB简介
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富的,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据库建立索引。
1.2.通过Docker安装MongoDB
#拉取镜像
docker pull mongo:4.0.3
#创建容器
docker create --name mongodb -p 27017:27017 -v /data/mongodb:/opt/mongodb/data mongo:4.0.3
#启动容器
docker start mongodb
#进入容器
docker exec -it mongodb /bin/bash
#使用MongoDB客户端进行操作
mongo
> show dbs #查询所有数据库
# admin 0.000GB
# config 0.000GB
# local 0.000GB
1.3.MongoDB基本操作
1.3.1.基本概念
1.3.2.数据库以及表的操作
#查看所有的数据库表
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
#通过use关键字切换数据库
> use admin
switched to db admin
#创建数据库
#说明:在MongoDB中,数据库是自动创建的,通过use切换到新数据库中,进行插入数据即可自动创建数据库。
> use testdb01
switched to db testdb01
> show dbs #发现并没有创建数据库
admin 0.000GB
config 0.000GB
local 0.000GB
> db.user.insert({
id:1,name:'zhangsan'}) #插入数据
WriteResult({
"nInserted" : 1 })
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
testdb01 0.000GB #数据库自动创建
#查看集合(表)
> show tables
user
> show collections
user
#删除集合(表)
> db.user.drop()
true #删除成功返回true,否则返回false
#删除数据库
> use testdb01 #先切换到要删除的数据中
switched to db testdb01
> db.dropDatabase()
{
"dropped" : "testdb01", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
1.3.3.新增数据
在MongoDB中,存储的文档结构是一种类似json的结构,称之为bson(全称为:Binary JSON)
> use testdb02
switched to db testdb02
# 语法:db.COLLECTION_NAME.insert(document)
> db.user.insert({
id:1,username:'zhangsan',age:20})
WriteResult({
"nInserted" : 1 })
> db.user.save({
id:2,username:'lisi',age:25})
WriteResult({
"nInserted" : 1 })
> db.user.find()#查询数据
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "id" : 1, "username" : "zhangsan", "age" : 20 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25 }
1.3.4.更新数据
update( )方法用于更新已存在的文档,语法格式如下;
db.collection.update(
<query>,
<update>,
[
upsert: <boolean>,
multi: <boolean>,
writeConcern:<document>
]
)
参数说明:
- query:update的查询条件,类似sql update查询内where后面的;
- update:update的对象和一些更新的操作符等,也可以理解为sql update查询内set后面的;
- upset:可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
- multi:可选,默认是flase,只更新查到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern:可选,抛出异常的级别
> db.user.find()
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "id" : 1, "username" : "zhangsan", "age" : 20 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25 }
#更新数据
> db.user.update({
id:1},{
$set:{
age:22}})
WriteResult({
"nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "id" : 1, "username" : "zhangsan", "age" : 22 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25 }
#注意:如果这样写,会删除掉其他字段
> db.user.update({
id:1},{
age:25})
WriteResult({
"nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "age" : 25 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25 }
#更新不存在的字段,会新增字段
> db.user.update({
id:2},{
$set:{
sex:1}})
WriteResult({
"nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find()
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "age" : 25 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
#更新不存在的数据,默认不会新增数据
> db.user.update({
id:3},{
$set:{
sex:1}})
WriteResult({
"nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.user.find()
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "age" : 25 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
#如果设置第一个参数为true,就是新增数据
> db.user.update({
id:3},{
$set:{
sex:1}},true)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5e490716171c2f3eb61c8eb3")
})
> db.user.find()
{
"_id" : ObjectId("5e4900a5421039b619d5fc70"), "age" : 25 }
{
"_id" : ObjectId("5e4900c8421039b619d5fc71"), "id" : 2, "username" : "lisi", "age" : 25, "sex" : 1 }
{
"_id" : ObjectId("5e490716171c2f3eb61c8eb3"), "id" : 3, "sex" : 1 }
1.3.5.删除数据
通过remove( )方法进行删除数据,语法如下
db.collection.remove(
<query>,
{
justOne:<boolean>,
writeConcern:<documents>
}
)
参数说明:
- query:(可选)删除的文档的条件
- justOne:(可选)如果设为true或1,则只删除一个文档,如果不设置该参数,或使用默认false,则删除所有匹配条件的文档
- writeConcern(可选)抛出异常的级别;
> db.user.remove({
age:25})
WriteResult({
"nRemoved" : 2 }) #删除所有匹配的数据
> db.user.find()
{
"_id" : ObjectId("5e490716171c2f3eb61c8eb3"), "id" : 3, "sex" : 1 }
#新插入4条数据
> db.user.insert({
id:1,username:'zhangsan',age:20})
WriteResult({
"nInserted" : 1 })
> db.user.insert({
id:2,username:'lisi',age:21})
WriteResult({
"nInserted" : 1 })
> db.user.insert({
id:3,username:'wangwu',age:22})
WriteResult({
"nInserted" : 1 })
> db.user.insert({
id:4,username:'zhaoliu',age:22})
WriteResult({
"nInserted" : 1 })
#删除1条数据
> db.user.remove({
age:22},true)
WriteResult({
"nRemoved" : 1 })
#删除所有数据
> db.user.remove({
})
WriteResult({
"nRemoved" : 4 })
#说明:为了简化操作,官方推荐使用deleteOne()与deleteMany()进行删除数据操作
db.user.deleteOne({
id:1})
db.user.deleteMany({
})
1.3.6.查询数据
db.user.find([query],[fields])
- query:可选,使用查询操作符指定查询条件;
- fields: