介绍


数据库:顾名思义,用来存储数据的仓库。

数据库从最早起使用文件存储发展到现在已经趋于成熟,现代的数据库分为两类。

  1. 关系型数据库

通常数据以表格形式存储,表格和表格之间可以设定一定的关联。




mongodb 数据源 mongodb自带的数据库_Powered by 金山文档


左表中的籍贯跟右表中的编号产生关联,此时,右表中的数据不允许删除,否则左表中的人员将失去籍贯,左表中不允许添加右表中不存在的籍贯,否则无法识别人员籍贯。

代表数据库:Mysql、SqlServer、Oracle。。。

  1. 非关系型数据库

非关系型数据库,通常以键值对形式存储数据,数据和数据之间没有一定的关联。

代表数据库:MongoDB、Redis。。。

Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象查询语言。Mongodb数据库旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

mongodb数据体系


mongodb 数据源 mongodb自带的数据库_mongodb_02


下载安装


下载地址:https://www.mongodb.com/download-center/community

注意:有些高版本mongodb不支持win7,所以win7需要安装稍低点的版本。

两种下载方式:

  1. .msi - 傻瓜式安装就好


mongodb 数据源 mongodb自带的数据库_mongodb 数据源_03


下载到本机后,双击进行安装mongodb数据库,一路下一步(next)即可(如果需要更改安装路径请自行选择):


mongodb 数据源 mongodb自带的数据库_mongodb_04


mongodb 数据源 mongodb自带的数据库_表名_05


安装完成后,可以通过服务方式启动,启动成功后,默认端口号为:27017


mongodb 数据源 mongodb自带的数据库_表名_06


测试命令:

mongo

不能用,就需要添加环境变量。


mongodb 数据源 mongodb自带的数据库_mongodb_07


  1. .zip - 需要手动配置
  • 解压,然后将文件夹放到目标位置,在这个文件夹中新建:
  • data文件夹,data文件夹中新建db文件夹
  • logs文件夹,logs文件夹中新建mongodb.log文件
  • 设置环境变量,将解压后的文件夹的bin文件夹设置为环境变量
  • 在命令行执行命令:
mongod.exe --logpath mongodb.log文件路径 --logappend--dbpath db文件夹路径 --directoryperdb--bind_ip0.0.0.0 --serviceName MongoDB --install
net start MongoDB

可以新建一个后缀为bat的文件,将上面的命令复制到文件中,将其中的logpath和dbpath修改,然后以管理员身份运行即可。在计算机的管理中,找到服务,在服务中找到mongodb,如果找到了,就说明能用了。

测试:

mongo


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_08


如果在双击这个文件的时候,报错说丢失 XX140.dll文件,提示,这是缺少了运行库文件,安装运行库文件。

命令行操作


基本操作

  • 打开cmd在命令行中输入命令:

mongo


mongodb 数据源 mongodb自带的数据库_表名_09


  • 退出mongoDB使用exit

exit


mongodb 数据源 mongodb自带的数据库_数据库_10


  • 查看所有的数据库列表:

show dbs


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_11


此命令不显示空库

  • 创建数据库或切换数据库:

use 数据库名

可以使用db命令来查看当前所在的数据库名称:

db


mongodb 数据源 mongodb自带的数据库_mongodb 数据源_12


当数据库存在,则切换到这个数据库,表示后面的操作是针对这个库的,如果数据库不存在,则创建这个库。

数据库中的表不需要创建,只要添加数据就能将表自动创建好。

  • 给数据库中创建一个members的集合,并向集合中添加文档(行)数据:

db.表名/集合名.insert(JSON格式数据)


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_13


数据是对象,则添加一条,数据是数组,则是多条。

  • 查看当前数据库中的集合列表:
# 查看当前数据库中的集合列表
show tables
# 或
show collections


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_14


表不需要创建,给指定的表添加数据,表自动会创建好。

  • 删除表

db.表名/集合名.drop()


mongodb 数据源 mongodb自带的数据库_mongodb_15


  • 删除库

需要进入要删除的库,然后再去执行这个命令

# 删除的是当前的库
db.dropDatabase()


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_16


增删改查

# 添加单条文档数据
db.表名/集合名.insertOne({ key: value , key: value...})
# 添加多条文档数据
db.表名/集合名.insertMany([{}, {}, {}])
# 可以添加单条也可以多条数据(为主)
db.表名/集合名.insert( {} )
db.表名/集合名.insert([{}, {} ])
  • 查询所有的数据
db.表名/集合名.find();    # 获取全部(推荐)
db.表名/集合名.find({});  # 获取全部

{ }用于条件限制,当没条件的时候,上述两个用法效果一致


mongodb 数据源 mongodb自带的数据库_数据库_17


关于_id
{ "_id" : ObjectId("5c0fa4758878caa23d36c0fb"), "name" : "zhangsan" }
objectID类型ObjectId对象对象数据组成:时间戳 |机器码|PID|计数器 系统自动生成 id的键值我们可以自己输入,但是不能重复,因此为了避免工作的复杂建议不要人为的去干预id的是很工程

  • 带条件查询

默认是“且”条件关系。

db.表名/集合名.find({key:value,key:value....})


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_18


  • 字段显示控制
db.表名/集合名.find(条件,{字段名:0或1,....})
# 0:不显示
# 1:显示
# _id字段,由于其是系统产生的,默认情况下是显示的


mongodb 数据源 mongodb自带的数据库_表名_19


  • 逻辑运算(稍微复杂一些)
### 条件表达式
# 年龄大于5的
db.表名/集合名.find({age:{$gt:5}});  #age > 5(great than)
# 年龄大于等于5的
db.表名/集合名.find({age:{$gte:5}}); #age >= 5 (great than & equal)
# 年龄小于5的
db.表名/集合名.find({age:{$lt:5}}); #age < 5  (less than)
# 年龄小于等于5的
db.表名/集合名.find({age:{$lte:5}}); #age <= 5
# 年龄不等于5的
db.表名/集合名.find({age:{$ne:5}}); #age != 5   (not equal)
# 在一个指定的数值中查询  $in    年龄在不在这几个指定数值当中
db.表名/集合名.find({age:{$in:[1,2,3]})  ## where xxx in '集合'

## 且关系  and
db.表名/集合名.find({age:{$lt:5},username:"user11"})
## where age < 5 & username = 'user11'

## 或关系 or(有点绕)
db.表名/集合名.find({$or:[{条件1},{条件2}]})
## 例如
db.表名/集合名.find({$or:[{age:{$ne:5}},{username: "user11"}]});

需求:查询出年龄小于30或者gender为0的数据
db.members.find({$or:[{age:{$lt:30}},{gender:0}]})


mongodb 数据源 mongodb自带的数据库_表名_20


mongodb 数据源 mongodb自带的数据库_mongodb_21


  • 模糊查询
#正则
db.表名/集合名.find({字段名:/正则/i})
# i 不区分大小写
# `不能加引号`,否则就成了字符串,成了字符串就成了精确匹配


mongodb 数据源 mongodb自带的数据库_Powered by 金山文档_22


如果指定的字段满足后面的正则表达式,则将数据查询出来

  • 统计
#统计总记录数
db.表名/集合名.count();      // 统计所有的记录的总数
db.表名/集合名.find({}).count(); // 统计符合条件的结果的记录总数


mongodb 数据源 mongodb自带的数据库_表名_23


count不能与find的顺序交换

  • 排序
# 排序
# 1 升序   -1 降序     字段
# 以age字段来升序
db.表名/集合名.find().sort({age:1})
# 以age字段来降序
db.表名/集合名.find().sort({age:-1})


mongodb 数据源 mongodb自带的数据库_数据库_24


  • 分页
# 指定获取几条  skip/limit   分页
db.表名/集合名.find().limit(3);
db.表名/集合名.find().skip(1).limit(3);

## skip表示起始位置,也就是从第几个开始
## limit表示获取的记录的个数(长度)
## skip与limit的顺序先后无所谓


mongodb 数据源 mongodb自带的数据库_mongodb_25


# 更新是要有条件的,没有条件在数据库层面来讲是可以更新的,但是实际是没有对应的业务需求

# 只修改单条文档
db.表名/集合名.updateOne({key:value},{$set:{key:value}})
# 修改符合条件所有文档数据
db.表名/集合名.updateMany({key:value},{$set:{key:value}})
## 如果上述两个方法的条件一致,并且有多个符合条件的,那么:
# updateOne,不管有多少个符合条件的只修改第一个
# updateMany,有多少改多少

# 字段的值的`自增和自减`
db.表名/集合名.updateOne({key:value},{$inc:{key:1}})     // increments,自增
db.表名/集合名.updateMany({key:value},{$inc:{key:1}})
db.表名/集合名.updateOne({key:value},{$inc:{key:-1}})        // decrements
db.表名/集合名.updateMany({key:value},{$inc:{key:-1}})
# 自增是整数,自减是负数
# 更新和删除操作允许不写条件,但是不能不写

删除在实际开发的时候一般不用,正常做程序开发的时候所使用的删除实际上是修改。

删除分为:真删除(物理删除)、假删除(逻辑删除)。

删除集合中已存在的文档数据:

# 删除单条文档
db.表名/集合名.deleteOne({ key: value })
# 删除符合条件多条文档
db.表名/集合名.deleteMany({key: value})
# 删除全部数据(慎用)
db.表名/集合名.deleteMany({})


mongodb 数据源 mongodb自带的数据库_数据库_26


nodejs中操作


通过第三方插件mongoose连接操作,mongoose是Node环境下异步操作mongodb数据库的扩展,仅限于Node环境下使用。

官网:http://www.mongoosejs.net/docs/index.html

下载安装:

# 安装mongoose
npm i -S mongoose

使用步骤:

  1. 导入
// 导入模块
const mongoose=require('mongoose')
  1. 连接
// 连接数据库 返回promise对象
mongoose.connect('mongodb://localhost:27017/数据库名', { 
    useNewUrlParser: true, 
    useUnifiedTopology: true
})
// 库必须要先存在

// connect方法参2在新版本需添加,否则会有警告提示
// useNewUrlParser:当前URL字符串分析器已弃用,将在将来的版本中删除。要使用新的解析器,请将选项{usenewurlparser:true}传递给mongoclient.connect。
// useUnifiedTopology:当前服务器发现和监视引擎已弃用,将在将来的版本中删除。要使用新的服务器发现和监视引擎,请将选项{useUnifiedTopology:true}传递给mongoclient构造函数
  1. 创建schema - 用于约束表中数据类型
// 创建用户集合规则
const UserSchema=newmongoose.Schema({
    // 字段名/域名称
    name: {
        // 指字域类型
        type: String,
        // 必填字段
        required: true,
        // 字段最小长度  minlength 用于字符串类型
        minlength: 2,
    },
    age: {
        type: Number,
        // 默认值
        default: 10,
        // 字段最小值 min用于数字类型
        min: 1,
    },
    pwd: String,
    email: String,
    // 定义此字段为 字符串数组类型
    hobbies: [String],
});

在定义schema的是有使用到相关约束规则,可以查看:http://www.mongoosejs.net/docs/guide.html

表不需要提前创建,会自动创建。

  1. 创建model - 用于对数据做增删改查
// 参数1:model名称,模型名一般会和表名一样
// 参数2:schema名称
// 参数3:操作的数据集合(表名)   如果参数3没有填写则以 参1的复数形式为操作数据集合名称
const Model=mongoose.model('User', UserSchema, 'users')

模型相关的操作方法如下:

// 模型相关方法
Model.insertMany({key:value})
Model.deleteMany({条件},err=>{})
Model.deleteOne({条件},err=>{})
Model.countDocuments({条件})
Model.find({条件},{可选字段返回:0/1},{skip:0,limit:10})
Model.findOne({条件},{可选字段返回:0/1})
// Model.updateMany({条件},{$set:{key:value}},res=>{})
Model.updateOne({条件},{$set:{key:value}},res=>{})

mongoose中的所有操作都是异步的,但内置了promise,所以我们可以使用async和await来将异步操作变成同步操作:

app.get('/insert', async (req, res) => {
    let ret=await userModel.insertMany([])
    if(ret){
       
    }else{
        
    }
})