MongoDB基础知识

144 阅读7分钟

MongoDB简介

1、数据库:数据库是按照数据结构来组织、存储和管理数据的仓库。

2、数据库分类:

(1)关系型数据库:MySQL、Oracle、DB2、SQL Server …… (关系数据库中全都是表)

(2)非关系型数据库:MongoDB、Redis …… (键值对数据库,文档数据库MongoDB)

3、MongDB简介:MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。(BSON)

4、数据库的服务器用来保存数据;数据库的客户端用来操作服务器,对数据进行增删改查

MongDB的基本操作

1、启动MongoDB (1)创建一个data文件夹,并在data文件夹中创建一个db文件夹

(2)执行命令:mongod --dbpath db的位置

指定端口号的命令:mongod --dbpath db的位置 --port 123 // 123就是指定的端口号 尽量用默认端口号(端口号最大不超过65535)

效果:

image.png

默认端口号为27017,可以直接访问

image.png

image.png

2、数据库的服务器用来保存数据,使用mongod 数据库的客户端用来操作服务器,对数据进行增删改查,使用mongo

3、MongoDB基本操作

image.png

(1)基本知识:

  • 数据库(database)
  • 集合(collection)
  • 文档(document)在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合

(2)基本指令:

show db
show database
    - 显示当前的所有数据库
use 数据库名
    - 进入到指定的数据库中
db
    - db表示的是当前所处的数据库
show collections
    - 显示数据库中所有的集合		
	
- 数据库的CRUD(增删改查)的操作
    - 向数据库中插入文档,注意下面的<collection>代表集合的名称
    db.<collection>.insert(doc)
	- 向集合中插入一个文档
	- 例子:向test数据库中的,stus集合中插入一个新的学生对象
		{name:"孙悟空",age:18,gender:"男"}
		db.stus.insert({name:"孙悟空",age:18,gender:"男"})
    db.<collection>.find()
	- 查询当前集合中的所有的文档

MongoDB CRUD操作的官方文档

MongoDB 插入文档


- db.collection.insert()
    - insert()可以向集合中插入一个或多个文档(用数组形式插入多个)
- db.collection.insertOne()
    - 向集合中插入一个文档
- db.collection.insertMany()
    - 向集合中插入多个文档

MongoDB查询文档

- 查询数据库中的文档
    - db.collection.find()
        - 可以根据指定条件从集合中查询所有符合条件的文档
        - 返回的是一个数组
    - db.collection.findOne()
	- 查询第一个符合条件的文档
	- 返回的是一个对象
    - db.collection.find().count()
	- 查询符合条件的文档的数量

MongoDB修改文档


- 修改数据库中的文档
    - db.collection.update(查询对象,新对象)
        - update()默认情况下会使用新对象来替换旧对象
	- 可以修改、替换集合中的一个或多个文档(update()默认情况下只修改一个)
        - 如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
            $set 可以用来修改文档中的指定属性
            $unset 可以用来删除文档中的指定属性
    - db.collection.updateOne()
	- 修改集合中的一个文档
    - db.collection.updateMany()
	- 修改集合中的多个文档
    - db.collection.replaceOne()
	- 替换集合中的一个文档

MongoDB删除文档

- 删除集合中的文档
    - db.collection.remove()
	- 删除集合中的一个或多个文档(默认删除多个)
        - remove()可以根据条件来删除文档,传递条件的方式和find()一样
        - 删除符合条件的所有文档(默认情况)
        - 如果remove()第二个参数为true,则只删除一个
        - 如果传递空对象,相当于清空集合
    - db.collection.deleteOne()
	- 删除集合中的一个文档
    - db.collection.deleteMany()
	- 删除集合中的多个文档

    - db.collection.remove({})
        - 清空一个集合
    - db.collection.drop()
	- 删除一个集合
        - drop()与remove()的区别:drop()直接将集合删除,只删除一次;remove()一条一条数据删除;
    - db.dropDatabase()
	- 删除一个数据库

MongoDB文档之间的关系

文档之间的关系
一对一(one to one)
    - 夫妻 (一个丈夫 对应 一个妻子)
    - 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系

一对多(one to many)/多对一(many to one)
    - 父母 - 孩子
        用户 - 订单
        文章 - 评论
        - 也可以通过内嵌文档来映射一对多的关系
        

多对多(many to many)
    - 分类 - 商品
        老师 - 学生 

Mongoose

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

2、Mongoose的好处:

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

3、mongoose中为我们提供了几个新的对象

– Schema(模式对象)

• Schema对象定义约束了数据库中的文档结构

– Model

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

– Document

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

3、mongoose的基本操作:

(1)安装mongoose包:npm install mongoose

(2)加载mongoose:var mongoose = require("mongoose");

(3)连接数据库:mongoose.connect("mongodb://地址")

举例:mongoose.connect("mongodb://localhost/mongoose_test");

(4)断开连接:mongoose.disconnect()

4、connection

  • 一旦连接了MongoDB数据库,底层的Connection对象就可以通过mongoose模块的connection属性来访问。
  • connection对象是数据库连接的抽象,它提供了对象连接、底层的DB对象和表示结合的Model对象的访问。
  • 并且可以对connection对象上的一些事件进行监听,来获悉数据库连接的开始与断开。比如可以通过open和close事件来监控连接的打开与关闭

案例:

// 引入
var mongoose = require("mongoose");
// 连接数据库
mongoose.connect("mongodb://localhost/mongoose_test");

mongoose.connection.once("open",function(){
    console.log("数据库连接成功~~~")
})

mongoose.connection.once("close",function(){
    console.log("数据库连接已断开~~~")
})

// 断开连接
mongoose.disconnect();

5、Schema模式对象

(1)作用:模式为集合中的文档定义字段和字段类型,模式就是对文档的约束。

(2)案例:

// 创建Schema(模式)对象
var Schema = mongoose.Schema;

var stuSchema = new Schema({
  name:String,
  age:Number,
  gender:{
      type:String,
      default:"female",
  },
  address:String,
});

6、Model模型对象:

(1)一旦定义好了Schema对象,就需要通过该Schema对象来创建Model对象

(2)案例

- 有了Model,就能对数据库进行增删改查操作了
Model.create(doc(s), [callback])
- 用来创建一个文档并添加到数据库中
- 参数:
    doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
    callback 当操作完成以后调用的回调函数
- 查询的:
    find(conditions, projection, options, callback)
        - 查询所有符合条件的文档 总会返回一个数组
    findById(id, projection, options, callback)
        - 根据文档的id属性查询文档 
    findOne(conditions, projection, options, callback)
        - 查询符合条件的第一个文档 总会返回一个具体的文档对象

        conditions 查询的条件
        projection 投影 需要获取到的字段
            - 两种方式
                {name:1,_id:0}
                "name -_id" // - 表示不用
        options 查询选项(skip,limit)
        callback 回调函数,查询结果会通过回调函数返回
                    回调函数必须传,如果不传回调函数,压根不会查询
    - 修改:
    Model.update(conditions, doc, options, callback)
    Model.updateMany(conditions, doc, optioins, callback)
    Model.updateOne(conditions, doc, options, callback)
        - 用来修改一个或多个文档
        - 参数
            conditions 查询条件
            doc 修改后的对象
            options 配置参数
            callback 回调函数
    Model.replaceOne(conditions, doc, optioins, callback)

7、Document文档对象:

(1)通过Model对数据库进行查询时,会返回Document对象或Document对象数组;Document继承自Model,代表一个集合中的文档;Document对象也可以和数据库进行交互操作

(2)Document对象的方法:

equals(doc)
id
get(path,[type])
set(path,value,[type])
update(update,[options],[callback]) save([callback])
remove([callback])
isNew
isInit(path)
toJSON()
toObject()