今天我们来说一下别具一格的 “非关系型”数据库——MongoDB
上面提到了非关系型,那么什么是非关系型?什么又是关系型呢?
关系型,大概可以理解为,一个人的各种信息,被分散成了N多个集合,来分别存储这个人的信息,每个集合只存储一个数据,例如:MySQL
而非关系型则恰恰相反,例如本文我们所说到的 MongoDB ,在 MongoDB 中我们存储的数据是以 js 中 object(对象)的形式存在的,自然一个人的信息被放在一个对象中,这样子就不会和其他的集合,表相关联。
关于数据库的介绍就简单总结到这里吧,重点还是数据库的实际操作:
启动服务器
1、以管理员身份打开命令行窗口,切换到D盘,并创建data\db目录,用来存放数据库文件。
cd E:
mkdir data\db
2、启动MongDB服务,并指定数据库文件存放的目录
mongod --dbpath=”D:\data\db”
操作数据库
查看数据库
show databases;
创建数据库
以管理员身份打开另一个命令行窗口,并运行mongo程序,连接到上一步启动MongDB服务。
mongo
使用数据库haogu,如果不存在,则会自动创建:
use haogu
新建students集合(collections),并向集合中插入两条数据(documents)
db.students.insertOne({ id: 1, name: ‘田龙龙’, age: 19, gender: ‘男’ })
db.students.insertOne({ id: 2, name: ‘王亚川’, age: 19, gender: ‘男’ })
查询students集合中所有的数据
db.students.find()
** 查看当前数据库的集合**
show collections;
插入文档
创建或插入操作会将新的文档(documents)添加到集合(collection)中。如果当前集合不存在,则插入操作会创建该集合。
MongoDB提供了如下几个方法用于将文档插入到集合中:
db.collection.insertOne()
db.collection.insertMany()
基础语法:
操作示例:
db.students.insertOne({ id: 1, name: ‘田龙龙’, age: 19, gender: ‘男’ })
db.students.insertOne({ id: 2, name: ‘王亚川’, age: 19, gender: ‘男’ })
删除文档
删除操作可以用来从集合中删除指定的文档,MongoDB为我们提供了如下方法:
db.collection.deleteOne()
db.collection.deleteMany()
基础语法:
操作示例:
db.students.deleteOne({id: 10});//删除id为10的学生
db.students.deleteMany({age: {$gt: 18}});//删除年龄大于18的所有学生
更新文档
更新操作修改集合中的现有文档。MongoDB提供了以下更新集合文档的方法:
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
基础语法:
操作示例:
db.students.updateOne({id: 9}, {$set: {gender: "男"}}); //将id为9的学生性别修改成“男”
db.students.updateMany({gender: "女"}, {$set: {age: 18}}); //将所有女生的年龄改成 18
db.students.replaceOne({id: 9}, {id: 10, name: "李浩洋", age: 33, gender: "男"}); //将id为9的学生替换一个新学生的信息。
查询文档
读取操作从集合中检索文档;即查询集合中的文档。MongoDB提供了从集合中读取文档的以下方法:
db.collection.find()
基础语法:
操作示例:
db.students.find({age: {$lt: 20}})//查询年龄小于20的学生
db.students.find({age: {$lt: 20}, gender: "男"})//查询年龄小于20,并且性别为“男”的学生
db.students.find({$or: [{age: {$lt: 20}}, {age: {$gt: 30}}]});//查询年龄小于20,或者大于30的学生
聚合管道
使用聚合管道可以对集合中的文档进行变换和组合。在实际项目中主要用于表关联查询和数据统计。
管道操作符
操作符 | 作用 |
---|---|
$project | 增加,删除,重命名字段 |
$match | 匹配条件,只有满足条件的文档才能进入下一阶段 |
$limit | 限制结果的数量 |
$skip | 跳过文档的数量 |
$sort | 条件排序 |
$group | 条件组合结果 |
$lookup | 用于引入其他集合的数据(表关联查询) |
$project
修改文档的结构,可以用来重命名,选择或过滤文档中的字段。
查询语句:
db.users.aggregate([
{$project: {name: 1, age: 1}}
])
查询结果:
/* 1 */
{
"_id" : ObjectId("5d818d88ad448c40fc70d1eb"),
"age" : 19,
"name" : "杨少博"
}
/* 2 */
{
"_id" : ObjectId("5d81a07b1387c63a84ecbb6e"),
"age" : 20,
"name" : "刑创业"
}
/* 3 */
{
"_id" : ObjectId("5d836728920f850fb85ff419"),
"age" : 18,
"name" : "汤蒙蒙"
}
/* 4 */
{
"_id" : ObjectId("5d836748920f850fb85ff41a"),
"age" : 22,
"name" : "方怡平"
}
$match
用于过滤文档,用法类似于find()方法中参数。
db.users.aggregate([
{$project: {name: 1, age: 1}},
{$match: {age: {$gte: 19}}}
])
/* 1 */
{
"_id" : ObjectId("5d818d88ad448c40fc70d1eb"),
"age" : 19,
"name" : "杨少博"
}
/* 2 */
{
"_id" : ObjectId("5d81a07b1387c63a84ecbb6e"),
"age" : 20,
"name" : "刑创业"
}
/* 3 */
{
"_id" : ObjectId("5d836748920f850fb85ff41a"),
"age" : 22,
"name" : "方怡平"
}
$group
将集合中的文档进行分组,可用于统计结果。
按照性别分组,统计男女同学的数量
【注】 写在最后,以上所有命令都在 cmd(命令行)中输入,为了方便查阅,将以上命令放在了 js 代码块中,但仅仅是为了方便查看,需要在命令行中输入
没使用过 win7 操作系统,所以这里只提供 win10 的复制粘贴方法
复制: 在 cmd 窗口中,选中所要复制的字段,按下 enter(回车) 键复制到粘贴板中
粘贴: 右键即可将复制的内容粘贴至 cmd 命令行窗口中
以上总结有错误之处,也请各路大佬指出