mongoDB 学习

mongoDB 学习

  • mongoDB 是一个非关系型数据库 (MySQL 是关系型数据库,关系型数据库里全是表)
  • mongoDB 是文档型数据库 (里面存的文档是增强版的 JSON,BSON)
  • MongoDB 数据库一般只需要连接一次,连接一次后,除非项目停止服务器关闭否则数据库不能断开

其他的关系型数据库需要每操作一次就要连接一次

安装 mongoDB

  • 去官网下载,我安装的是社区版,安装一路无脑 next

  • 需要配置环境变量:将 MongoDB 的 bin 路径添加到 path 环境变量下,在 cmd 中输入 mongo 就会出现像 node 一样的命令行 (如果没有出来请重启一下电脑)

  • 安装完成后在 C 盘根目录下新建一个文件夹 data,在里面新建文件夹下新建 db (这个目录是数据默认储存的目录)

  • 打开命令行窗口:输入 mongod 启动 mongodb 服务器

  • 打开另一个命令行窗口:输入 mongo 进行数据库连接,出现 > 证明启动成功 (打开的是服务器的客户端)

  • 更改 mongo 数据库的储存位置命令:mongod --dbpath 数据库路径 --port 端口号 (默认监听 27017 端口)

  • 不支持使用 http 协议去访问 mongodb 数据库,要使用 https 协议

在数据库端选中某个内容的时候这个时候数据库服务已经暂停了,这时再去客户端连接数据库会一直处于等待的状态

  • 将 mongoDB 设置为系统服务:(可以在后台自动启动,不需要手动启动)
    • 新版本的 mongo 已经注册好了服务,所以可以不用启动服务器他也会自动运行

mongoDB 的基本操作

  • 数据库(database) > 集合(collection) > 文档(document)

  • 查看 mongoDB 里有多少个数据库:

show dbs
# 或者
show databases
  • 进入数据库:
use test
# 进入 test 数据库
  • 当创建文档时,如果文档所在的集合或者数据库不存在,会自动创建数据库和集合 (当我们向里面添加数据的时候他就会被自动创建)

  • 获取现在所在的数据库:db

    • db 是一个变量,保存你现在在的数据库
  • 查看当前数据库所有的集合:

show collections

数据库的 CRUD 的操作

增加 (Create)
  • 向集合中插入一个或多个文档:
db.<collection>.insert(doc)
  • 向集合 (collection 里写要插入文档的名字) 中插入一个文档 (传入多个的时候传入对象数组)
  • 例如:向学生集合里添加一个对象
db.students.insert({"name":"菜鸟小铭","gender":"男"})
  • 当向数据库添加文档时会自动往每一项里添加一个 "_id" 属性,他不会重复 (类似于主键)
    • id 属性可以自己指定,但是必须确保唯一性
// 插入一个文档对象
db.collection.insertOne()
// 插入多个文档对象
db.collection.insertMany()
查询 (Retrieve)
  • find 查找所有复合条件的文档:(函数里面可以接收一个对象作为参数),返回的是一个数组
db.<collection>.find()
  • 例如我查找名字叫菜鸟小铭的数据:
db.students.find({name:"菜鸟小铭"})
// 返回:[{ "_id" : ObjectId("5f844bd06b30ac729c520bec"), "name" : "菜鸟小铭", "gender" : "男" }]
  • 注意,find 返回的是数组类型,所以想要使用里面的值的时候需要加上 [0] 才能使用里面对象的属性
  • 也有 findOne
// 返回满足条件的第一个文档 (返回的是对象)
db.students.findOne()
  • 可以使用 count 函数查询集合里面有多少个文档
db.students.find().count();
// 返回 students 集合里有多少个文档
修改 (Update)
db.<collection>.update(查询条件, 修改, {配置对象});
// 下面这三种方法其实是把 update 的方法细分了

// 修改第一个复合条件的文档
db.<collection>.updateOne()
// 修改多个复合条件的文档
db.<collection>.updateMany()
// 替换一个文档
db.collection.replaceOne()
  • 注意:update 默认会使用新对象去替换旧的对象,默认情况下只修改一个

update 还有第三个参数是一个对象,里面是修改的配置,其中的 multi: true 的时候就是可以修改多个

  • 如果只需要修改指定的属性而不是替换需要使用 修改操作符

    • $set 可以用来修改文档中的指定属性
    • $push 可以用来向数组中添加数据
    • $addToSet 也可以用于向数组中添加数据,但是他不会重复的添加属性
  • 例如我想把我的名字改成 noobMing

db.students.update({name:"菜鸟小铭"},{$set:{name:"noobMing"}})
  • $unset 删除文档的指定属性

  • 例如我要删除表里面的 age 属性

db.students.update({name:"noobMing"},{$unset:{age:1}})
  • 这里的对象必须是对象格式,值可以随意写
删除 (Delete)
  • remove 会删除所有符合条件的文档
db.<collection>.remove({条件}, 是否删除一个)
db.<collection>.deleteOne()
db.<collection>.deleteMany()
  • remove 第二个参数传一个 true 则只会删除第一个符合条件的文档 (和 deleteOne 等效)

  • 如果传递一个空对象作为参数,则会删除集合中所有的文档 (清空集合,但是性能略差,他需要先匹配每一个文档再进行删除)

    • 这种时候直接删除集合需要的复杂度要小的很多:
    // 直接删除整个集合
    db.<collection>.drop();
    // 删除整个数据库
    db.dropDatabase();
    
  • 一般数据库中的数据都不会被删除,所以很少调用删除方法

    • 一般添加一个字段表示这个数据是否被删除

通过内嵌文档对文档进行查询,属性名必须使用引号
mongoDB 中同样支持 for 循环

  • 查询操作符:

    • $gt: 10 值大于 10 的数,$lt: 10 值小于 10 的数
    • $or: [] 表示满足中括号里或的条件 (写的时候注意要将 or 写在最外层,否则会报错找不到 $or 的定义)
  • limit() 每页显示的条数

  • skip() 跳过多少条数据

// 查询 numbers 中 num 大于 40 小于 50 的文档 (不包括等于)
db.numbers.find({num: {$gt: 40, $lt: 50}});
// 选取小于 40 或者大于 50 的数
db.numbers.find({$or: [{num: {$gt: 50}},{num: {$lt: 40}}]})
// 查询 numbers 中的 10 条到 20 条数据
db.numbers.find().skip(10).limit(10);
  • mongoDB 会自动调整 skip() 和 limit() 的位置 (写前写后结果是一样的)
  • 在 update 里面有自增修改符 $inc 例如我想让 sal 自增 400 {$inc: {sal: 400}} (自减的话把后面的数改成负数就可以了)

数据库的文档操作

  • 文档之间的操作:
    • 一对一:通过内嵌文档的方法可以实现一对一 (内嵌文档是把一个文档 (对象) 作为属性给一个键)
    • 一对多:像在实际生活中的订单,可以新建一个表专门存储订单,里面可以添加一个 user_id 属性,并且和用户表的属性值相同 (和用户表单中的 _id 属性相同)
    • 多对多:像在生活中的老师和学生之间的关系,还是通过 user_id 来进行多对多的关系

数据库的输出排序

  • 函数 sort() 指定数据库输出排序的规则
  • 假如我想让数据库根据 number 升序排列:
db.numbers.find().sort({num: 1});
// 这里 1 是升序排列,-1 是降序排列 (取其他值都会报错)
  • 如果里面传入多个条件的话先按照第一个条件排列,当第一个条件一样时才按照第二个条件进行排列

  • 在查询时,可以在 find 函数第二个参数的位置设置查询结果的投影

  • 假如我只想显示员工的名字:

db.emp.find({}, {ename: 1});
// 1 显示,0 不显示 (但是默认显示 _id 属性)

Mongoose 学习

  • Mongoose 是一个让我们可以通过 node 来操作 Mongo 的模块

  • Mongo 在普通模式下没有类型约束,但是这个插件可以对数据库里的内容进行约束

  • mongoose 提供了几个新的对象:

    • Schema (模式对象)
      • Schema 对象约束了数据库中的文档结构
    • Model
      • Model 是集合中所有的文档,相当于 collection
    • Document
      • 表示集合中具体的文档,相当于集合中的具体的某个文档

Mongoose 基础使用

  • mongoose 安装:npm install Mongoose --save

  • 引入 mongoose:var mongoose = require('mongoose');

    • 注意:必须使用 es5 的写法,es6 的 import 写法会报错
  • 连接数据库:mongoose.connect('mongodb://localhost/test');

    • 如果端口号是默认端口号则可以省略

    如果直接这样连接的话,他会报两个警告,这时只需要在 connect 第二个参数上添加 { useNewUrlParser: true, useUnifiedTopology: true } 这两个属性他就不会报错了

  • 监听数据库连接状态

    • 在 mongoose 对象中有一个属性叫 connection,它可以表示数据库连接状态
    // 监听数据库连接与断开
    mongoose.connection.once("open",function() {});
    mongoose.connection.once("close",function() {});
    
  • 断开数据库的连接:(很少使用)

mongoose.disconnect();

Schema(约束) 对象

  • Schema 是对数据库中的内容的类型的一个约束,也可以用来设置默认值 (让我想起了 propTypes)
// 将 mongoose.Schema 赋值给一个变量
var Schema = mongoose.Schema;
// 创建 Schema 对象
var stuSchema = new Schema({
    // 指定 name 类型的是字符串
    name: String,
    age: Number,
    gender: {
        type: String,
        // 设置默认值为 female
        default:"female"
    }
});

Model(集合) 对象

  • Model 是个构造函数,他可以创建和读取 document (和 collection 的层级差不多)

  • 通过 Schema 创建 Model

  • 创建 model 的第一个参数 (集合名),系统会自动将他变成复数 (例如下面的 student 他就会自动变成 students)

// 对 students 进行约束
var StuModel = mongoose.model('student', stuSchema);
// 创建文档
// StuModel.create(doc, function(err) {})
StuModel.create({ name: "noobMing" }, function (err) {
    if (!err) {
        console.log("插入成功");
    }
});
Model 中的方法
  • count 方法:计算数据库集合中匹配文档的数量
Model.count(conditions, [callback]);
增加
  • 使用 Model 对数据库进行增删改查
  • 创建一个或多个文档添加到数据库中:
    • StuModel.create(doc(s), [callback])
    • docs:可以是一个文档对象,也可以是一个文档对象的数组
查询
  • 对文档进行查询:
    • find():查询所有符合条件的文档 (返回一个数组)
    • findById():根据 id 属性来查询文档,第一个参数传递的是字符串
    • findOne():查询符合条件的第一个,返回某个具体的文档对象
Model.find(conditions, [projection], [options], [callback]);
  • conditions:查询的条件
  • projection:投影 (除了之前写对象的形式来投影以外,还可以使用字符串的方式进行投影,用空格分隔,写上的属性表示投影出来,前面加负号的表示不投影出来)
  • option:查询选项 (skip,limit)
  • callback:回调函数,查询结果通过回调函数返回 (必选)
StuModel.find({ name: "noobMing" }, function (err, docs) {
    if (!err) {
        console.log(docs);
    }
})
  • 通过 find 查询的结果,返回的对象就是 Document 文档对象
修改
  • 参数和添加的差不多
Model.update(conditions, doc, [options], [callback]));
  • doc:修改的对象
StuModel.update({ name: "noobMing" }, { $set: { age: 20 } }, function (err) {
    if (!err) {
        console.log("修改成功");
    }
})
  • 还有一个 replaceOne 方法用来替换,用法类似
删除
  • 很少使用这个 api
Model.remove(conditions, [callback]);
Model.deleteOne(conditions, [callback]));
Model.deleteMany(conditions, [callback]));
StuModel.remove({name:"noobMing"},function (err) {
    if (!err) {
        console.log("删除成功");
    }
})

Document 中的方法

  • Document 对象是 Model 的实例 (使用 instanceof 判断)
创建 Document
  • 分为两步,创建 Document 和把创建的内容保存到数据库
// 创建 document
var stu = new StuModel({
    name: "yexian",
    age: "48"
});

// 保存到数据库
stu.save(function (err) {
    if (!err) {
        console.log("保存成功");
    }
});
修改删除文档中的数据
  • 在文档中进行操作就不用考虑匹配的问题
// 修改文档中的第一项
StuModel.findOne({}, function (err, doc) {
    if (!err) {
        doc.update({ $set: { age: 20 } }, function (err) {
            if (!err) {
                console.log("修改成功");
            }
        })
        // 或者也可以这样写
        doc.age = 20;
        doc.save();
        // 直接删除这个文档
        doc.remove(function (err) {
            if (!err) {
                console.log("拜拜");
            }
        })
    }
})
get,set 方法
  • get 方法,获取文档中指定的属性值 (其实用. 也可以)
  • set 方法,设置文档中的属性值 (没有调用 save 方法,所以数据库里的值并没有改变)
  • id 属性:获取文档的 id 属性值
doc.get("age");
// 等价于 doc.age

// set(name, value);
doc.set("age",20);
// 等价于 doc.age = 20;

// 获取 id 属性
doc.id;
  • 将 document 转换为普通对象
// 转换成普通对象
doc.toObject();
  • 没有转化为普通对象前是不能对 document 里面的值进行删除的 (使用 delete 无效),只有转换成对象才能用
  • 注意:转换成普通对象后所有 Document 方法和属性都不能使用了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值