今天我们来学习下MongoDB数据库,首先了解下MongoDB是什么。
MongoDB作为NoSQL数据库,它将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB可以为WEB应用提供可扩展的高性能数据存储解决方案,其主要特点如下:
- 面向集合存储,易存储对象类型的数据。
- 模式自由
- 支持动态查询
- 可通过网络访问
- 支持查询
- 支持复制和故障恢复
- 支持完全索引,包含内部对象
- 文件存储格式为BSON(一种JSON的扩展)
- 自动处理碎片,以支持云计算层次的扩展性
- 使用高效的二进制数据存储,包括大型对象(如视频等)
看起来挺牛X的,那么问题来了,MongoDB可以取代mysql么,还是两种数据库结合使用,他们有啥区别呢。
MongoDB系列计划分为多篇,包括从零入门、Springboot集成MongoDB、高级特性等。
本文是MongoDB系列第一篇,重点介绍安装使用以及常用的命令语法。
首先介绍下安装MongoDB。
安装
MongoDB有Community和Enterprise两个版本,我们下载免费的Community版本即可。
官网下载页面,根据自己的系统选择安装对应的版本。
我这里是macOS版本,使用Homebrew安装
brew tap mongodb/brew
brew update
brew install mongodb-community@5.0
安装完成后,启动服务
brew services start mongodb-community@5.0
查看版本
mongod -version
版本结果如下:
db version v5.0.7
Build Info: {
"version": "5.0.7",
"gitVersion": "b977129dc70eed766cbee7e412d901ee213acbda",
"modules": [],
"allocator": "system",
"environment": {
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
下面我们介绍MongoDB常用的Shell命令。
连接数据库
连接本地数据库,默认端口27017,未设置密码,默认directConnection=true。
mongosh "mongodb://localhost:27017"
Current Mongosh Log ID: 6260f8b212cbac8b5e45a789
Connecting to: mongodb://localhost:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.3.1
Using MongoDB: 5.0.7
Using Mongosh: 1.3.1
创建数据库
登录后,当前默认的库名 是test
我们可以使用 use 创建数据库。如果数据库不存在,则创建数据库,否则切换到指定数据库。
use DATABASE_NAME
示例如下:
test> use demo
switched to db demo
demo>
CRUD
MongoDB的操作语句和mysql的差别还是挺大的,个人感觉MongoDB偏向面向对象的思想,对后台开发者更友好。
插入文档
插入文档有单个插入和批量插入。
语法:
db.myCollection.insertOne()
db.myCollection.insertMany()
示例1:
db.user.insertOne({name: 'luoxiang',
age: 2,
tags: ['teacher', 'smart']
})
// 返回信息
{
acknowledged: true,
insertedIds: { '0': ObjectId("626121d412cbac8b5e45a78a") }
}
示例2:
db.user.insertMany([
{ name: 'nanshan',
age: 80,
tags: ['doctor', 'good']
},
{ name: 'zhangfei',
age: 55,
tags: ['soldier', 'strong']
}
])
查询文档
查询所有,类似SQL select * from user
db.user.find()
指定eq条件查询,
db.user.find( { "name": "zhangsan" } )
其他条件查询,{
// in条件查询
db.user.find( { name: { $in: [ "yindongxu", "zhangsan" ] } } )
AND查询
db.user.find( { name: "zhangsan", "age": { $gte: 7 } } )
更新文档
更新文档有3种方式:
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
示例1:更新单个
db.user.updateOne( { name: "zhangsan" },
{
$set: {
tags: "hello world"
}
})
示例2:更新多个
db.user.updateMany(
{ age: { $lt: 50 } },
{
$set: { tags: "age less than 50" }
}
)
示例3:替换文档
替换除了id外的其他字段,替换文档可以具有与原始文档不同的字段。
db.user.replaceOne(
{ name: "nanshan" },
{ name: "zhongnanshan", title: "教授", desc: [ "医生", "老师" ] }
)
最终数据库的数据如下:
删除文档
删除文档包括删除单个文档、删除多个文档
db.collection.deleteMany()
db.collection.deleteOne()
删除单个文档示例:
db.user.deleteOne( { name: "zhangfei" } )
删除多个文档示例:
db.user.deleteMany( { tags: "age less than 50" } )
常用操作符
条件操作符
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
$type 操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
如果想获取 “user” 集合中 name 为 String 的数据,你可以使用以下命令:
db.user.find({"name" : {$type : 'string'}})
或
db.user.find({"name" : {$type : 2}}) // 2代表String类型,具体对应关系请自行查询
结果如下:
排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
示例:
db.user.find().sort({age:1})
聚合
MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。语法如下:
db.<collection>.aggregate([
{
<$stage1>
},
{
<$stage2>
}
...
])
示例:
db.user.aggregate([{$group : {_id : "$name", num_tutorial : {$sum : 1}}}])
类似SQL select name, count(*) from user group by name
。
这里只给了一个简单的示例,聚合还包括管道,这里就不展开了。
总结
SQL和MongoDB的比较如下:
SQL术语 | MongoDB术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | SQL表对应MongoDB集合 |
row | document | SQL记录行对应MongoDB文档 |
column | field | SQL表字段对应MongoDB域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB的语法对后台开发者还是挺友好的,极易上手,数据结构灵活,容易扩展,至于性能如何,请看下文分解。
文档信息
- 本文作者:yindongxu
- 本文链接:https://iceblow.github.io/2022/04/19/MongoDB%E5%85%A5%E9%97%A8/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)