MongoDB



MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB

  • 打开cmd命令行窗口

    • 输入 mongod 启动mongodb服务器
  • 在打开一个cmd窗口

    • 输入 mongo 连接mongodb ,出现 >
  • 还可以自定义data存储的路径和端口

    • mongod –dbpath 数据库路径 –port 端口号
  • 将MongoDB设置为系统服务,可以自动在后台启动,不需要每次都手动启动

    • 在此之前在data目录下新建db和log文件夹,在D:\mongoDB\serve\3.2\目录下创建mongod.cfg,并写入

      1
      2
      3
      4
      5
       systemLog:
      destination: file
      path: D:\data\log\mongod.log
      storage:
      dbPath: D:\data\db
    • 以管理员身份打开命令行窗口,执行如下的命令

      • sc.exe create MongoDB binPath= “"D:\mongoDB\serve\3.2\bin\mongod.exe" –service –config="D:\mongoDB\serve\3.2\mongod.cfg"“ DisplayName= “MongoDB” start= “auto”

      • sc.exe create MongoDB binPath= “"mongod的bin目录\mongod.exe" –service –config="mongo的安装目录\mongod.cfg"“ DisplayName= “MongoDB” start= “auto”

    • 在任务管理器启动mongodb服务

数据库(database)

  • 数据库的服务器

    • 服务器用来保存数据
    • mongod 用来启动服务器
  • 数据库的客户端

    • 客户端用来操作服务器,对数据进行增删改查的操作
    • mongo 用来启动客户端
  • 基本概念

    • 数据库(database)
    • 集合(collection)
    • 文档(document)
      • 在MongoDB中,数据库和集合都不需要手动创建,
        当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合
    • Scheme、model、collection、document是其中的四大元素。document是MongoDB里的基本存储单位,collection是众多同类document的集合。Schema定义了一类document的模板,让这一类document在数据库中有一个具体的构成、存储模式。而Schema仅仅是定义了Document是什么样子的,至于生成document和对document进行各种操作(增删改查)则是通过相对应的model来进行的

  • 基本指令
    • show dbs
    • show databases
      • 显示当前的所有数据库
    • use 数据库名
      • 进入到指定的数据库中
    • db
      • db表示的是当前所处的数据库
    • show collections
      • 显示数据库中所有的集合

数据库的CRUD(增删改查)的操作

MongoDB官方文档

插入文档

  • db.collection.insert()

    • 向集合中插入一个或多个文档
    • 当我们向集合中插入文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id,该属性用来作为文档的唯一标识
    • _id我们可以自己指定,如果我们指定了数据库就不会在添加了,如果自己指定_id 也必须确保它的唯一性
  • db.collection.insertOne()

    • 插入一个文档对象
  • db.collection.insertMany()

    • 插入多个文档对象

删除文档

  • db.collection.remove()

    • 删除一个或多个,可以第二个参数传递一个true,则只会删除一个
    • 如果传递一个空对象{}作为参数,则会删除所有的
  • db.collection.deleteOne()

  • db.collection.deleteMany()

  • db.collection.drop()

    • 删除集合
  • db.dropDatabase()

    • 删除数据库
  • 一般数据库中的数据都不会删除,所以删除的方法很少调用

  • 一般会在数据中添加一个字段,来表示数据是否被删除

查询文档

  • db.collection.find()

    • find()用来查询集合中所有符合条件的文档
    • find()可以接收一个对象作为条件参数
      • {} 表示查询集合中所有的文档
      • {属性:值} 查询属性是指定值的文档
    • find()返回的是一个数组
  • db.collection.findOne()

    • 用来查询集合中符合条件的第一个文档
    • findOne()返回的是一个文档对象
  • db.collection.find({}).count()

    • 查询所有结果的数量
  • MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配

  • 如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号

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

    • sort()可以用来指定文档的排序的规则,sort()需要传递一个对象来指定排序规则 1表示升序 -1表示降序
    • limit skip sort 可以以任意的顺序进行调用
    • 在查询时,可以在第二个参数的位置来设置查询结果的投影,1表示显示该字段,0表示不显示

修改文档

  • db.collection.update(查询条件,新对象)

    • update()默认情况下会使用新对象来替换旧的对象
    • 如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
    • update()默认只会修改一个
  • db.collection.updateMany()

    • 同时修改多个符合条件的文档
  • db.collection.updateOne()

    • 修改一个符合条件的文档
  • db.collection.replaceOne()

    • 替换一个文档

修改器

  • $set
    1. 修改器用来指定一个键值。如果这个键不存在,则创建他
    2. 修改内嵌文档
  • $unset
    • 用于将键删除
  • $push
    • 用于向数组中添加一个新的元素
  • $addToSet
    • 向数组中添加一个新元素,如果数组中已经存在了该元素,则不会添加
  • $each
    • 和$addToSet修改结合起来用,可以一次添加多个不同的值
  • $pop
    • 从数组中删除元素,他可以从数组中的任何一端删除元素
  • $pull
    • 基于特定条件来删除元素。
  • $inc
    • 用来增加或减少已有的键的键值((只能为满足要求的数字)),或者在键不存在的时候创建一个键
  • $ne
    • 如果一个值不在数组里面就把他加进去,如果在不添加
  • $gt:大于
  • $lt:小于
  • $gte:大于或等于
  • $lte:小于或等于
  • $inc:自增

Mongoose

  1. 下载安装Mongoose

    • npm i mongoose –save
  2. 在项目中引入mongoose

    • var mongoose = require(“mongoose”);
  3. 连接MongoDB数据库

    • mongoose.connect(‘mongodb://数据库的ip地址:端口号/数据库名’, { useMongoClient: true});
    • 如果端口号是默认端口号(27017) 则可以省略不写
  4. 断开数据库连接(一般不需要调用)

    • MongoDB数据库,一般情况下,只需要连接一次,连接一次以后,除非项目停止服务器关闭,否则连接一般不会断开

      • mongoose.disconnect()
    • 监听MongoDB数据库的连接状态

      • 在mongoose对象中,有一个属性叫做connection,该对象表示的就是数据库连接,通过监视该对象的状态,可以来监听数据库的连接与断开
    • 数据库连接成功的事件

      • mongoose.connection.once(“open”,function(){});
    • 数据库断开的事件

      • mongoose.connection.once(“close”,function(){});

Schema

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
例子:
//将mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;

//创建Schema(模式)对象
var stuSchema = new Schema({

name:String,
age:Number,
gender:{
type:String,
default:"female"
//默认值为female
},
address:String

});

Model

  • 有了Model,我们就可以来对数据库进行增删改查的操作了
  • Model.create(doc(s), [callback])

    • 用来创建一个或多个文档并添加到数据库中
    • 参数:
      • doc(s) 可以是一个文档对象,也可以是一个文档对象的数组
      • callback 当操作完成以后调用的回调函数
  • 查询:

    • 通过find()查询的结果,返回的对象,就是Document文档对象

    • Model.find(conditions, [projection], [options], [callback])

      • 查询所有符合条件的文档 总会返回一个数组
    • Model.findById(id, [projection], [options], [callback])

      • 根据文档的id属性查询文档
    • Model.findOne([conditions], [projection], [options], [callback])

      • 查询符合条件的第一个文档 总和返回一个具体的文档对象

        • conditions 查询的条件
        • projection 投影 需要获取到的字段
          • 两种方式
            • {name:1,_id:0}
            • “name -_id”
        • options 查询选项(skip limit)//跳过,显示的最大数量{skip:3 , limit:1}
        • callback 回调函数,查询结果会通过回调函数返回
        • 回调函数必须传,如果不传回调函数,压根不会查询
  • 修改

    • Model.update(conditions, doc, [options], [callback])
    • Model.updateMany(conditions, doc, [options], [callback])
    • Model.updateOne(conditions, doc, [options], [callback])
      • 用来修改一个或多个文档
      • 参数:
        • conditions 查询条件
        • doc 修改后的对象
        • options 配置参数
        • callback 回调函数
    • Model.replaceOne(conditions, doc, [options], [callback])
  • 删除:

    • Model.remove(conditions, [callback])
    • Model.deleteOne(conditions, [callback])
    • Model.deleteMany(conditions, [callback])
  • 统计文档的数量

    • Model.count(conditions, [callback])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
例子:
//通过Schema来创建Model
//Model代表的是数据库中的集合,通过Model才能对数据库进行操作
//mongoose.model(modelName, schema):
//modelName 就是要映射的集合名 mongoose会自动将集合名变成复数
var StuModel = mongoose.model("student" , stuSchema);

//向数据库中插入一个文档
//StuModel.create(doc, function(err){});
StuModel.create({
name:"白骨精",
age:16,
address:"白骨洞"
},function (err) {
if(!err){
console.log("插入成功~~~");
}
});

Document

  • Document对象是Model的实例(可以用instanceof验证)
  • Document 和 集合中的文档一一对应 , Document是Model的实例
    • 通过Model查询到结果都是Document
  • document的方法
    • Model#save([options], [function])
      • 和model的create作用相同,但是document只能用save
        • update(update,[options],[callback])
      • 修改对象
        • remove([callback])
      • 删除对象
        • get(name)
      • 获取文档中的指定属性值
        • set(name , value)
      • 设置文档的指定的属性值
        • id
      • 获取文档的_id属性值
        • toJSON()
      • 转换为一个JSON对象//不一定生效
        • toObject()
      • 将Document对象转换为一个普通的JS对象
      • 转换为普通的js对象以后,注意所有的Document对象的方法或属性都不能使用了

        模块化

  • 定义一个连接数据库的模块
    1
    2
    3
    4
    5
    var mongoose = require("mongoose");
    mongoose.connect("mongodb://数据库的ip地址:端口号/数据库名",{useMongoClient:true});
    mongoose.connection.once("open",function () {
    console.log("数据库连接成功~~~");
    });
  • 其他模块直接通过require引入该模块即可