作为一名前端程序猿,怎么可以不学习mongoDB,BSON(binary json)始于JSON,nodejs+mongodb的搭配让前端涉猎后台项目更加得心应手。话不多说,开整!
一、数据库的安装
下载: 官网下载地址
下载最新版本,几乎是傻瓜安装
注意:这一步取消选中,不然会下载MongoDB Compass (一个图形界面管理工具),安装时间将大大增加。
如果安装的不是系统盘,还需要配置环境变量
mongodb配置环境变量
二、mongoDB简介
- 旨在为WEB应用提供可扩展的、高性能的数据存储方案
- 数据存储结构有key 、value组成,类似JSON
- 属于NoSql(not only sql),非关系型数据库、分布式计算
- 国外很多大厂使用:facebook google mozilia so on…
三、可视化管理工具
可视化管理工具太多了。例如Database Master、Fang of Mongo、Mongo3、studio 3t…自行选择,用习惯了哪个都行,我是大佬带我用的studiio 3t,界面简洁very nice。
可视化工具studio3T展示效果如下:
-
tree ivew
-
table view
-
json view
四、启动数据库与命令行操作
- mongod
mongod 命令可来启用数据库服务,即搭建并开启服务器,可以通过默认端口27017被访问( http://localhos:27017/)
mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。
配置数据库文件的存储位置,如果不配置双击安装目录bin下的mongod.exe ,会闪退
mongod -dbpath "D:\mongodatabase\data"//安装时配置的 data存放路径
- mongo
双击安装目录bin下的mongo.exe 即启动mongodb shell客户端(一个互动的JavaScript接口的MongoDB,可以使用MongoShell来查询和更新数据以及执行管理操作)
更多操作方法 mongodb shell操作
五、基础概念学习
基本概念:数据库 集合 文档
盗个图mongodb和sql的对应关系
六、基本CURD API
创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)
1、数据库操作
- 连接数据库
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
- 创建数据库
use DATABASE_NAME
- 删除数据库
db.dropDatabase()
2、集合操作
- 创建集合
db.createCollection(name, options)
- 删除集合
db.collection.drop()
3、文档操作
- 插入文档
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.save(document)
db.collection.insertOne()
db.collection.replaceOne()
db.collection.insertMany():
- 更新文档
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
- 删除文档
db.collection.remove(
<query>,
<justOne>
)
//remove() 方法 并不会真正释放空间。repairDatabase方法来回收磁盘空间
db.repairDatabase()
db.inventory.deleteMany({})
db.inventory.deleteOne( { status: "D" } )
- 查询文档
db.collection.find(query, projection)
// and 查询
db.col.find({key1:value1, key2:value2}).pretty()
//or查询
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
文档原子操作(基本操作)
- $set 用来指定一个键并更新键值,若键不存在并创建。
- $unset 用来删除一个键。
- $inc 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作
- $push $pushAll把value追加到field里面去,
- $pull 从数组field内删除一个等于value值。
- $addToSet增加一个值到数组内,而且只有当这个值不在数组内才增加。
- $pop删除数组的第一个或最后一个元素
- $rename 修改字段名称
- $bit 位操作,integer类型
七、操作符和基础方法
- $gt 大于
- $lt 小于
- $gte 大于等于
- $lte 小于等于
例: 查找col集合 num域 小于200大于100的数据
db.col.find({num : {$lt :200, $gt : 100}})
- $type 匹配某种数据类型的数据
例:查找col集合 title为string类型的数据
db.col.find({"title" : {$type : 'string'}})
- limit() skip() 跳过与限定数量
例:分页查询
db.col.find().limit(10).skip(10)
-
sort() 排序 1升序 -1降序
-
createIndex() 创建索引
-
aggregate()聚合 (用于处理数据诸如统计平均值,求和等)
八、进阶操作
- 文档之间的关系 (嵌入式,引用式)
- 不同集合之间的文档关联 DBRefs { $ref : , $id : , $db : }
- 覆盖索引 (ensureIndex 存在于RAM,读取速度快)
高级索引:索引数组 、索引子文档
- MapReduce计算模型
Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。
db.collection.mapReduce(
function() {emit(key,value);}, //map 函数
function(key,values) {return reduceFunction}, //reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number
}
)
- 全文检索
创建全文检索
db.col.ensureIndex({post_text:"text"})
使用全文索引
db.col.find({$text:{$search:"str"}})
- 正则表达式
>db.col.find({post_text:{$regex:"regStr"}})
- gridFS
添加文件
mongofiles.exe -d gridfs put song.mp3
查看文件中的文档
db.fs.files.find()
查看区块数据
db.fs.chunks.find({files_id:ObjectId('id')})
- 固定集合(后插入的元素就会覆盖最初始的头部的元素)
db.createCollection("cappedLogCol",{capped:true,size:10000,max:1000})
九、运维操作
- 复制迁移
- 分片 (多台服务器分割数据)
- 备份与恢复
- 监控
- 查看分析 explain() hint()
十、Mongoose
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具
mongoose官网
简单理解
nodejs→express
mongo→mongoose