MongoDB

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库(NoSql,Not Only SQL)之间的产品,是非关系数据库当***能最丰富,
最像关系数据库的。它支持的数据结构非常松散,是类似json的bson(byte json)格式,因此可以存储比较复杂的数据类型。

Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库
单表查询的绝大部分功能,而且还支持对数据建立索引。

特点:

  1. 节省内存,实现冷热数据(热数据放内存,冷数据放硬盘)
  2. 高并发情况下快速写入海量数据的一种产品
  3. 可以写筛选条件

属性:

  1. database 数据库:是一个仓库,在仓库中可以存放集合。
  2. collection 集合:类似于数组,在集合中可以存放文档。
  3. document 文档:数据库中的最小单位,存储和操作的内容都是文档。
    在MongoDB中,数据库和集合都不需要我们手动创建。
    当我们创建文档时,如果文档所在的集合或数据库不存在的时会自动创建数据库和集合。

MongoDB和关系型数据库的比较:

  1. 不需要提前设计好数据结构
  2. 往里面写数据,只要是json格式就行了

安装:

  1. 下载 https://www.mongodb.com/try/download/community
  2. 配置环境变量
  3. 在C盘根目录下创建 data 文件夹,并在data文件夹中创建 db 文件夹(数据库路径)
  4. 在cmd 命令行中 输入 mongod 运行服务端
    (32位机器第一次启动时需要输入 mongod --storageEngine=mmapv1,后续启动不需要)
  5. 再打开一个命令行窗口,输入 mongo 运行打开客户端

指定数据路径命令: mongod --dbpath 物理路径
指定端口启动: mongod --dbpath 物理路径 --port 端口号

默认端口:27017

将MongoDB设置为系统服务,可以自动在后台启动,不用每次都手动启动。

图形化工具:
1. MongoChef | NoSQL for MongoDB Freeware
F6 执行当前光标所在行的语句

2. Studio 3T

基本操作:

  1. 基本指令:
    show databases
    show dbs

    • 显示当前所有的数据库

      use 数据库名

    • 进入到指定的数据库中

      db

    • db表示的是当前所处的数据库

      show collections

    • 显示数据库中所有的集合

  2. CRUD操作:
    (1)新增:

     db.<collection>.insert(doc)
     - 向数据库中插入文档
     - 当我们向集合中插入文档时,如果没有给文档指定 _id  属性时,则数据库会自动为文档添加 _id,
     该属性用来作为文档的唯一标识, ObjectId(),时间戳与机器码。
     _id 可以自己指定,如果指定了数据库就不会自动添加,但是需要保证唯一。
     - 例子:向test数据库中的,stus集合 中插入一个新的学生对象
         {name:"孙悟空",age:18,gender:"男"}
         db.stus.insert({name:"孙悟空",age:18,gender:"男"})
    
     db.<collection>.insertOne(doc)
     - 插入一个文档,3.2版本以后支持
    
     db.<collection>.insertMany(doc)
     - 插入多个文档,3.2版本以后支持

    (2)查询:

     db.<collection>.find()
     db.<collection>.find({})
     - 查询当前集合中的所有文档 (注意:开发时绝对不会去查询所有的数据,性能较差)
     - 例子:查找stus集合的所有文档
         db.stus.find()
    
     db.<collection>.find({属性:值})
     - 查询属性是指定值的文档。
    
     find()返回的是一个数组
     findOne()返回的是一个集合对象
    
     db.<collection>.findOne()
     - 查询集合中符合条件的第一个文档
    
     db.<collection>.find().count()
     - 查询结果的数量

    (3)修改:

     db.<collection>.update(查询条件, 修改为新对象)
     - 默认情况下会使用新对象替换旧的对象。
     - 如果需要修改指定的属性,而不是替换为需要使用“修改操作符”来完成修改
     - $set 可以用来修改文档中的指定属性
     - $unset 删除一个属性
     - update 默认只会修改一个
    
     db.stus.update({name:"孙悟空"},{age:500})
     - 这会将旧的数据替换为 {age:500} 对象
    
     db.stus.update({name:"孙悟空",age:18,gender:"男"},{name:"孙悟空",age:500,gender:"男"})
     - 将数据的age改为500
    
     updateOne()
     - 修改一个文档,3.2版本以后支持
    
     updateMany()
     - 修改多个文档,3.2版本以后支持
    
     replaceOne()
     - 替换一个文档

    (4)删除:

     db.<collection>.remove(查询条件)
     - 删除符合条件的所有文档
     db.<collection>.remove(查询条件, true)
     - 删除符合条件的一个文档
     db.<collection>.remove({})
     - 删除所有文档,性能略差,直接删除集合 db.<collection>.drop()
    
     db.<collection>.deleteOne(查询条件)
     - 删除一个文档
    
     db.<collection>.deleteMany(查询条件)
     - 删除多个文档
    
     db.dropDatabase()
     - 删除数据库
  3. 文档之间的关系:
    (1)一对一(one to one):

     - 在MongoDB中可以通过内嵌文档的形式来提现一对一的关系。
     - db.wifeAndHusband.insert({name:"黄蓉",husband:{name:"郭靖"}})

    (2)一对多(one to many)

     - 通过内嵌文档的方式映射一对多的关系
     - db.usersAndOrders.insert({name:"张三",orders:[{orderNum:"111111"},{orderNum:"222222222222"}]})

    (3)多对多(many to many)

  4. _sort 和 投影:
    db.stus.find()

    • 查询文档时,默认情况是按照 _id 的值进行升序排序

      db.stus.find().sort(排序规则)

    • sort() 可以用来指定文档的排序规则,sort() 需要传递一个对象来制定规则, 1表示升序, -1表示降序

      db.stus.find().sort({age:1,name:-1})

    • 可以指定多个排序规则

    • limit, sort, skip 可以以任意的顺序进行调用

      db.stus.find({},{name:1,_id:0,age:1})

    • 在查询时,可以在第二个参数位置来设置查询结果,投影,上述例子查询的只有name,age 列的数据

Mongoose
Mongoose是一个让我们可以通过Node来操作MongoDB的模块。
Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。
在多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处。

好处:
1. 可以为文档创建一个模式结构(Schema)
2. 可以对模型中的对象/文档进行验证
3. 数据可以通过类型转换转换为对象模型
4. 可以使用中间件来应用业务逻辑挂钩
5. 比Node原生的MongoDB驱动更容易

新的对象:
1. Schema(模式对象)
- Schema对象定义约束了数据库中的文档结构

2. Model 
    - Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection

3. Document
    Document表示集合中的具体文档,相当于集合中的一个具体的文档

这个三个对象的创建是有顺序的:先创建Schema,再创建Model,后创建Document

https://mongoosejs.com/

使用步骤:
1. 下载安装Mongoose:
npm i mongoose --save
2. 在项目中引入mongoose:
var mongoose = require("mongoose");
3. 连接MongoDB数据库:
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
如果端口是默认端口号(27017),则可以不写
4. 断开数据库连接:
mongoose.disconnect()

监听MongoDB数据库的连接状态
- 在mongoose对象中,有一个属性叫connection,该对象表示的就是数据库连接,
  通过监视该对象的状态,可以来监听数据库的连接与断开。
1. 数据库连接成功的事件:
    mongoose.connection.once("open",function(){});
2. 数据库断开的事件:
    mongoose.connection.once("close",function(){});
全部评论

相关推荐

11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务