Mongodb

一、mongodb

mysql sql Sever

mongodb:就是一个数据库.

data = [
	{
		id: 1,
		username: '张三',
		nickname: '法外狂徒'
	}{
		id: 2,
		username: '张三',
		nickname: '法外狂徒'
	}
]

1、介绍

Mongodb是一个介于关系数据库和非关系数据库之间的产品(Nosql),是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类似javascript面向对象的查询语言(又有一种在学习JavaScript的感觉),它是一个面向集合的,模式自由的文档型数据库。Mongodb数据库旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

  • MongoDB是一个数据库
  • 操作语法有点像JavaScript的面向对象写法
  • 关系型数据库和非关系型数据库结构区别

对应关系

mongodb数据体系

数据体系

上图所表达的含义:

  • 一个数据库中可以包含多个collection(表)
  • 一个collection(表)里可以包含多个document(行)

2、下载安装

官网:https://www.mongodb.com/

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

下载windows的安装版本:

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

1

2

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

链接mongodb的客户端,注意在安装目录/bin下

3、基本指令

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

此命令就是运行1_client.bat的执行效果

mongo

登录

  • 退出mongoDB使用exit
exit
或
Ctrl + C			强制取消

退出

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

在MySQL中,查询数据库信息是show databases

列出的库都是非空的库

show dbs

查看数据库

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

use切换数据库时,若库存在则切换,如果数据库不存在则创建并切换

use创建的数据库只是一个空的数据库,没有集合,所以show dbs不显示空数据库。

use 数据库名

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

db

切库

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

表是不需要先行进行定义的,当我们往一个表中插入记录后,表就自动出来了。

JSON格式数据:不是严格意义上的json数据,key名可以不使用引号包裹

db.表名/集合名.insert(JSON格式数据)
# 表名/集合名是不存在的(第一次插入数据的时候),当数据插入完毕则表名就存在了

插入数据

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

查看表

  • 删除表
db.表名/集合名.drop()

删除表

  • 删除库

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

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

删除库

刚才命令集合:

  • show dbs:查看数据库列表
  • use db:使用/创建数据库
  • db:查看当前库名
  • db.表名.insert():新增数据&可能会创建出一个数据表
  • show tables / show collections:查看当前库中的表列表
  • db.表名.drop():删除指定的表
  • db.dropDatabase():删除当前的库

4、增删改查

增删改查:英文名叫做C[create]U[update]R[read]D[delete]

4.1、添加

向集合中添加文档数据:

# 添加单条文档数据
db.表名/集合名.insertOne({ key: value , key: value...})

# 添加多条文档数据
db.表名/集合名.insertMany([{}, {}, {}])

# 可以添加单条也可以多条数据(为主)
db.表名/集合名.insert( {} )
db.表名/集合名.insert([{}, {} ])

例如:

  • 使用insertOne添加单个数据到shop库的members集合

insertOne

  • 使用insertMany添加2个数据到shop库的members集合

插入多条

  • 使用insert添加2个数据到shop库的members集合

insert插入多条

后续实际使用的比较多的是:insertOne()、insert({}),插入多个的形式仅作了解。

4.2、查询
  • 查询所有的数据

类似于原生的SQL:select * from table [where xxx]

db.表名/集合名.find();    # 获取全部(推荐)
db.表名/集合名.find({});  # 获取全部

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

查询所有

关于_id

{ “_id” : ObjectId(“5c0fa4758878caa23d36c0fb”), “name” : “zhangsan” }

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

  • 带条件查询

类似于MySQLwhere语句

此处允许使用多个条件,如果有就在"{}"中多写几个,默认是“且”条件关系

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

带条件查询

  • 字段显示控制

类似于MySQLselect后的字段选择,select username,password from members

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

字段显示控制

  • 逻辑运算(稍微复杂一些)
### 条件表达式
# 年龄大于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)

大于、小于、大于等于、小于等于、不等于

  • 模糊查询

类似于原生的SQL语句:where xxxx like '%YYY%'

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

正则

  • 统计

类似于MySQL中的select count(id) from table

计数操作:数记录的数量

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

统计

注意点:find()顺序是否可以与count()颠倒。

count不能与find的顺序交换

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

排序

  • 分页(实用)

原生的SQL中:

  • select * from table where id > 50 limit 10,10
  • select * from table where id > 50 limit 10
# 指定获取几条  skip/limit   分页
db.表名/集合名.find().limit(3);
db.表名/集合名.find().skip(1).limit(3);

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

分页

4.3、更新

根据条件修改已存在集合中的文档数据:

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

# 只修改单条文档
db.表名/集合名.updateOne({key:value},{$set:{key:value}})
# 修改符合条件所有文档数据
db.表名/集合名.updateMany({key:value},{$set:{key:value}})

更新

4.4、删除

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

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

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

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

删除

二、node操作mongoDB

1、Mongoose介绍

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

mongoose是Node环境下异步操作mongodb数据库的扩展,仅限于Node环境下使用。

使用mongoose操作mongodb数据步骤:

  • 使用npm安装mongoose
  • 导入模块
  • 然后使用(烦)
    • 连接mongodb数据库
    • 定义Schema:类似于表单的前端js验证的操作
      • schema:简单的来讲就是规定了表结构的操作。比如:要求表中有username字段,该字段接着要求必填,可以继续要求该字段类型为string,还可以要求这个字段长度为10(相当于mysql建表时候的sql语句对字段的规定)
    • 定义model:mvc模式
      • mvc:开发模式,要求将一个项目拆分成三个大的主体部分(m模型、v视图、c控制器),其中m负责业务逻辑与数据库的交互部分、v负责展示给用户页面、c控制器负责请求与响应的整体调度
      • vue、react:mvvm
    • 使用model进行数据增删改查操作
2、连接数据库

使用npm安装mongoose模块,并在使用模块中导入:

# 安装mongoose
nr
// 导入模块
const mongoose = require('mongoose')
// 连接数据库 返回promise对象
mongoose.connect('mongodb://localhost:27017/数据库名')
// 库必须要先存在
3、定义Schema

Schema是mongoose中会用到的一种数据模式,可以理解为数据表结构的定义;每个schema会映射到mongodb中的一个集合,它不具备操作数据库S的能力。Schema中定义数据校验,默认值,字段名,字段类型等特性。

作用:

  • 建表(也就是说,后期建表不再通过mongoDB的命令行的形式产生了,而是通过JavaScript代码实现)

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

// 创建用户集合规则
const users = new mongoose.Schema({
    // 字段名/域名称
    name: {
        // 指字域类型
        type: String,
        // 必填字段
        required: true,
        // 字段最小长度  minlength 用于字符串类型
        minlength: 2,
    },
    age: {
        type: Number,
        // 默认值
        default: 10,
        // 字段最小值 min用于数字类型
        min: 1,
    },
    pwd: String,
    email: String
});

在Schema定义好后,后期增删改查时,如果对应的表不存在,则其会自动按照Schema的约束进行建表,如果表存在了则不重新建立。

4、定义model

model 是由schema 生成的模型,模型是最终用来进行数据增删改查操作使用的,可以对数据库的操作:

注意:上面原生方法,不能在这里用.

// 参数1:model名称,模型名一般会和新创建表名一样,最好保持和返回值一直,否则是不可预知的错误.
// 参数2:schema名称
const model = mongoose.model('users',  users)

// 模型相关方法
// 插入操作
model.insertMany({key:value})
model.insertMany([{key:value}])
// 删除
model.deleteOne({条件})
model.deleteMany({条件})
// 查询操作
model.find({条件},{可选字段返回:0/1},{skip:0,limit:10})
model.findOne({条件},{可选字段返回:0/1})
// 更新操作
model.updateMany({条件},{$set:{key:value}})
model.updateOne({条件},{$set:{key:value}})
5、在express中使用mongoose

需求:通过postman发送post数据给express服务器,能够对mongoDB中的shop库中的members表进行插入操作。

  • 创建库
    • use shop
  • 创建express服务器,接受post传参
  • 连接数据库(mongoDB)
  • 定义schema(创建表members
  • 定义模型实现数据的添加操作
// - 创建express服务器,接受post传参
const express = require('express')
const app = express()

// 使用中间件解析post数据
app.use(express.urlencoded())

// 1. 引入mongoose
const mongoose = require('mongoose')

// - 连接数据库(mongoDB)
mongoose.connect("mongodb://localhost:27017/shop");

// - 定义schema(创建表members)
const members_schema = new mongoose.Schema({
    username: {
        type: String,
        minlength: 2,
    },
    password: {
        type: String,
        minlength: 8,
    },
    // 后续如果需要更多的字段,接着写即可
});

// - 定义模型实现数据的添加操作
const Model = mongoose.model('Member', members_schema)

app.post('/',(req,res) => {
    // console.log(req.body);
    // 写入数据到mongoDB
    // Model.insertMany(req.body)
    // 查询
    Model.find().then(ret => console.log(ret))
    // 象征性输出
    res.send('hi')
})

app.listen(9527,() => {
    console.log('server is running at http://127.0.0.1:9527');
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值