前言
上周在看项目的时候,看到数据库是使用mongodb,之前从来没有接触过就显得有点懵,这周就大概看了一下mongodb的基础用法
MongoDB介绍
Mongo是一个基于分布式文件存储的Nosql数据库。支持的数据结构非常松散,可以通过json格式来修改插入数据。
使用场景
1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将
订单所有的变更读取出来。
4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等。
应用特点:
- 数据量大
- 写入操作频繁(读写都很频繁)
- 价值较低的数据,对事务性要求不高
什么是NoSQL
NoSQL是"Not Only SQL"的缩写,指的是非关系型数据库,是一种用于存储和检索大量数据的数据库管理系统,其数据存储模型不遵循传统的关系型数据库的表格模型。NoSQL数据库通常使用更灵活的数据模型,更适合处理半结构化和非结构化数据,
关系型数据库:采用表格模型,数据以行和列的形式存储,具有固定的表结构和数据类型。
NoSQL数据库:根据不同的类型可以有多种数据模型,包括文档型、键值对、列族、图等,通常更加灵活,能够存储半结构化和非结构化数据。而mongodb就是文档型数据库
文档数据库 MongoDB。
文档型数据库和关系型数据的区别:
关系数据库使用表格(表)来存储数据,其中每个表包含固定数量的列和无限数量的行。对于关系数据库,必须知道拥有哪些列。
文档型数据库使用类似于JSON或BSON格式的文档来存储数据。MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,一个文档认为是一个对象。字段数据类型是字符集。
Mongodb的常见操作
1、数据库操作
选择和创建数据库,如果数据库不在会自行创建
//use 数据库名称
use yunzhi
查看有权限查看的所有的数据库命令
show dbs
或
show databases
查看当前正在使用的数据库命令
db;
删除数据库,会删除当前使用的数据库
db.dropDatabase()
2、集合操作(也就是mysql的表操作)
集合创建(表创建)
db.createCollection("person")
查看当前库中的表:show tables命令
show collections
或
show tables
集合的删除
db.person.drop()
3、文档基本CRUD
文档的插入(如果当前集合不存在,会自行创建)
(1)单个文档插入
//一条数据插入
db.person.insertOne({name: '张三', age: 18})
(2)批量插入
//多条数据插入
db.person.insertMany([
{name: '李四', age: 19},
{name: '王五', age: 20},
])
db.person.insertMany([
{name: '赵公明', age: 30, address: 'yunzhi'},
{name: 'yunzhi', age: 21},
])
1)person集合如果不存在,则会隐式创建
4)插入的数据没有指定 _id ,会自动生成主键值(采用的是Object)
5)如果某字段没值,可以赋值为null,或不写该字段。
文档的基本查询
db.collection.find(<query>, [projection])
1)query,可选,使用查询运算符指定选择筛选器。
2)projection,可以指定查询字段返回
(1)查询所有
db.comment.find()
或
db.comment.find({})
(1)按照条件查询
db.person.find({name: 'yunzhi'})
如果你只需要返回符合条件的第一条数据,我们可以使用findOne命令来实现,语法和find一样。下面再插入一条name为yunzhi的数据。
db.person.insertOne({name: 'yunzhi', age:22})
db.person.find({name: 'yunzhi'});
db.person.findOne({name: 'yunzhi'});
(2)投影查询(Projection Query)
如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。
查询结果只显示 _id、name。默认 _id 会显示
db.person.find({name: 'yunzhi'}, {name: 1});
如果不显示_id。_id设置为0
db.person.find({name: 'yunzhi'}, {name: 1, _id: 0});
文档的更新
(1)局部修改
如果我们想修改name为张三的记录,年龄为30,输入以下语句:
db.person.updateOne(
{name: '张三'},
{$set: {age: NumberInt(30)}}
)
db.person.find({name: '张三'})
(2)批量的修改
db.person.update(
{name: 'yunzhi'},
{$set: {age: NumberInt(30)}}
)
db.person.find({name: 'yunzhi'});
从下图发现使用update进行修改,他只会默认修改一条符合条件的进行修改
如果想进行批量修改使用updateMany
db.person.updateMany(
{name: 'yunzhi'},
{$set: {age: NumberInt(30)}}
)
db.person.find({name: 'yunzhi'});
删除文档
db.collection.remove({})
或
db.collection.deleteOne()
db.collection.deleteMany()
指定条件进行删除, 会删除全部符合条件的数据
db.person.remove({name: "yunzhi"}) (不推荐,显示弃用)
或
db.person.deleteMany({name: "yunzhi"})
指定条件进行删除, 删除单挑数据
db.person.deleteOne({name: "yunzhi"})
文档的分页查询
(1)统计查询
统计查询count()方法
db.collection.count()
统计所有记录数:
db.collection.count()
统计符合条件的记录数:
db.person.count({name: "yunzhi"})
2)分页列表查询
返回指定条数的记录,使用find方法后调用limit来返回结果
db.person.find().limit(3)
skip方法同样接受一个数字参数作为跳过的记录条数。
db.person.find().skip(3)
分页查询,2个结合能实现分页查询效果
//第一页
db.person.find().skip(0).limit(2)
//第二页
db.person.find().skip(2).limit(2)
//第三页
db.person.find().skip(4).limit(2)
更多查询
1)比较操作符查询
db.person.find({ age : { $gt: 20 }})
// 大于: field > value
db.person.find({ age : { $lt: value }})
// 小于: field < value
db.person.find({ age : { $gte: value }})
// 大于等于: field >= value
db.person.find({ age : {$lte: value }})
// 小于等于: field <= value
db.person.find({ age : {$ne: value }})
// 不等于: field != value
包含查询使用$in操作符,查看name字段包含 yunzhi 或 张三 的文档
db.person.find({name:{$in:["yunzhi","张三"]}})
2)条件连接查询
要查询同时满足两个以上条件,使用$and操作符,查看name字段为yunzhi, age字段值为30
db.person.find({
$and: [
{ age: { $eq: 30 } },
{ name: "yunzhi" }
]
});
要查询满足一个条件满足的数据,使用$or操作符,查看name字段为yunzhi, age字段值为30
db.person.find({
$or: [
{ age: { $eq: 30 } },
{ name: "yunzhi" }
]
});
总结
总体下来,mongodb的操作还是相对简单,如果有接触过mysql数据库等相关的数据库,学习基础操作从mongodb官网看着相关的api很容易上手。
参考文章
https://docs.mongoing.com/
https://www.runoob.com/mongodb/mongodb-tutorial.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。