MongoDB基础

MongoDB

简介

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

特点

  • 高性能
  • 易部署
  • 易使用
  • 非常方便的存储数据

对比MySQL

基本操作

MongoDB的操作有很多,需要掌握更多技能的同学可以查询在线的文档,这里主要是讲这么去学习这个工具

在线文档教程: https://www.runoob.com/mongodb/mongodb-tutorial.html

语法

show dbs: 查询所有数据库
use 数据库名: 创建并且选中数据库,数据库已经存在则直接选中
db: 查询当前选择的数据库
db.dropDatabase(): 删除当前选中的数据库
show collections: 查询当前库中的集合
db.createCollection("集合名"): 创建集合
db.集合名.drop(): 删除集合

注意: db.集合名 == db.getCollection("集合名")

数据类型

在MongoDB中支持以下的数据类型

String(字符串): mongodb中的字符串是UTF-8有效的 
Integer(整数): 存储数值。整数可以是32位或64位,具体取决于您的服务器
Boolean(布尔): 存储布尔(true/false)值
Double(双精度): 存储浮点值
Arrays(数组): 将数组或列表或多个值存储到⼀个键中
Timestamp(时间戳): 存储时间戳
Object(对象): 嵌⼊式⽂档
Null (空值): 存储Null值
Symbol(符号): 与字符串相同,⽤于具有特定符号类型的语⾔
Date(⽇期): 以UNIX时间格式存储当前⽇期或时间
Object ID(对象ID) : 存储⽂档ID
Binary data(⼆进制数据): 存储⼆进制数据
Code(代码): 将JavaScript代码存储到⽂档中
Regular expression(正则表达式): 存储正则表达式

新增文档

往集合中新增文档,当集合不存在时会自动先创建集合,再往集合中添加文档,但是不要依赖自动创建集合的特性

语法

db.集合名.insertOne( 文档 ) : 往集合中插入一个文档
db.集合名.insertMany([ 文档1, 文档2 ]):往集合中插入多个文档
db.集合名.insert( 文档 ) : 往集合中插入一个文档或者多个

实例

//插入用户对象
db.users.insert({id: 1, name: "小云", age: 20})
//注意:直接写数字默认是Duble类型,其实在使用时是不影响的,仅仅只是类型问题

更新操作

修改集合中已经存在的文档

语法

db.集合名.update(
  <query>,
  <update>,
  {
        upsert: <boolean>,
        multi: <boolean>,
        writeConcern: <document>
  }
)

参数说明

query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,是否要做数据0丢失

简化方法

更新1个:db.集合名.updateOne( ... )
更新所有:db.集合名.updateMany( ... )

实例

//把一个带有name=小云 的文档,修改其age值为18
db.employees.updateOne({name: "逍遥"}, {$set: {age: 30}})

//修改所有name=小云 的文档,修改其name=xiaoyun,age=20
db.employees.updateMany({name: "逍遥"}, {$set: {name: "bunny", age: 30}})
添加列

直接set一个不存在的列即可

db.users.update({age:22}, {$set:{sex:'男'}})
删除列

使用$unset

db.users.update({name:'xiaofei'}, {$unset:{sex:''}})

实例

删除操作

删除集合中的文档

语法

db.集合名.remove(
  <query>,
  {
        justOne: <boolean>,
        writeConcern: <document>
  }
)

简化方法:
删除1个:db.集合名.deleteOne( ... )
删除所有:db.集合名.deleteMany( ... )

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别

实例

//删除_id=xxx的文档
db.users.deleteOne({_id: ObjectId("xxx")})

//删除所有带有name=bunny的文档
db.users.deleteMany({name: "bunny"})

//删除当前数据库中所有文档
db.users.deleteMany({})

查询操作

语法

db.集合名.find(query, projection)
  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)

实例

//查询所有文档
db.users.find({})

排序查询

db.users.find({}).sort({字段: 1}) -> 按照字段升序排列
db.users.find({}).sort({字段: -1}) -> 按照字段降序排列

分页查询

sikp(num): 跳过num个文档,相当于start
limit(num): 限制显示num个文档,相当于pageSize
如:
db.users.find({}).skip(num).limit(num)
第n页:
db.users.find().skip((currentPage-1) * pageSize).limit(pageSize)

需求:按照年龄降序排列,查询第2页,每页显示3个
db.users.find({}).sort({"age":1}).skip(3).limit(3)

比较查询

语法 -> find({字段: {比较操作符: 值, ...}})
比较操作符
  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte
  • (!=) 不等 - $ne
  • 集合运算 - KaTeX parse error: Expected '}', got 'EOF' at end of input: …n 如:{name: {in: [“xiaoyao”,“bunny”]}}
  • 判断存在 - KaTeX parse error: Expected '}', got 'EOF' at end of input: …s 如:{name: {exists:true}}

逻辑查询

语法 -> find({列:{逻辑操作符: [条件1, 条件2, ...]}})
逻辑操作符
  • (&&) 与 - $and
  • (||) 或 - $or
  • (!) 非 - $not
实例
//查年龄在28 到 30间的用户信息
db.users.find({$and:[{age:{$gte:28}},{age:{$lte:30}}]})

//查看年龄小于28或者年龄大于30用户信息
db.users.find({$or:[{age:{$lte:28}},{age:{$gte:30}}]})

模糊查询

MongoDB的模糊查询使用的是正则表达式的语法 如:{name: {KaTeX parse error: Undefined control sequence: \* at position 11: regex: /^.\̲*̲keyword\.*/}}

实际上MongoDB也是不擅长执行模糊查询的,在实际开发中也是不使用的,该功能了解即可

实例

//查name中包含fei字样,并且年龄在28 到 30间的用户信息
db.users.find({$and: [{name: {$regex: /fei/}}, {age: {$gte: 28,$lte: 30}}]})

数组操作

给所有数据加数组字段

db.users.updateMany({}, {$set:{hobby:[]}})

添加

$push

$push : 给数组字段添加数据, 允许数据元素重复

//给name等于小云的用户添加'java', 'c', 'vue' 爱好
db.users.update({name:'小云'}, {
   $push:{hobby:{$each:['java', 'c', 'vue']}}
})
$addToSet

$addToSet: 给数组字段添加数据, 不允许数据元素重复

db.users.update({name:'小云'}, {$addToSet:{hobby:'java'}})

删除

$pop

$pop 删除数组中数据, 1:删除最后一个, -1: 删除第一个
局限: 只能从头或者从尾删除, 不能通过指定元素删除

//删除name=小云 用户最后一个兴趣
db.users.update({name:'小云'},{$pop:{hobby:1}} )
$pull

$pull 删除数组中数据, 通过指定内容删除

//删除name=小云 用户java兴趣选项
db.users.update({name:'小云'},  {$pull:{hobby:'c'}})

修改

方式1: 通过索引修改

//将name=小云的用户索引为1的兴趣改为 go
db.users.update({name:'小云'}, {$set:{'hobby.1':'go'}})

方式2:通过数组元素修改

//将name=小云的用户 c 兴趣 改为 c#
db.users.update({name:'小云', hobby:'c'}, {$set:{'hobby.$':'c#'}})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小云很优秀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值