mongoDB
mongoDB概念:https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html(mysql中的表,在mongodb中叫 集合。我这里统一用表表示,好理解点)
mongodb中基本的概念是文档、集合(collection)、数据库。之所以和 sql 数据库不一样叫法,应该是底层存储逻辑不一样。
- mongoDB的特点:
- mongoDB的设计目标是极简、灵活、作为web应用栈的一部分。
- mongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构。简单理解MongoDB这个数据库中存在的是各种各样的JSON。
- 对存储的数据没有约束性,可以任意存储数据。就像一个JSON对象,可以任意添加字段;且字段的数据类型可以任意修改。
- 数据库:数据库
- 集合(collection): 集合 类似 sql 中的 表。
- 文档(document):文档 类似 sql 中的一条 记录;
注意:在 MongoDB中,数据库和集合都不需要手动创建。当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。 - 域(field):就是 字段
注意:MongoDB不支持 表连接;MongoDB自动将_id字段设置为主键。
mongoDB查询语句:https://blog.csdn.net/qq_41767116/article/details/125586683 或 https://www.runoob.com/mongodb/mongodb-create-database.html
-
基础概念:
- use DATABASE_NAME:创建数据库。如果数据库不存在,则创建数据库,否则切换到指定数据库。
新建 数据库,不在数据库列表中。要显示它,我们需要向 runoob 数据库插入一些数据。 - show dbs:查看所有数据库。显示数据库列表。
- show collections:显示当前数据库下所有集合
- db:当前数据库
- db.集合:集合对象。如,db.userInfo,就是 userInfo 集合。
查询语句,一般就是调用集合下的方法:
- use DATABASE_NAME:创建数据库。如果数据库不存在,则创建数据库,否则切换到指定数据库。
-
创建 / 切换数据库:如果数据库不存在,则创建数据库,否则切换到指定数据库。
use db_name -
查看所有数据库
show dbs -
新增:
db.bank_and_security.insert({'资金帐号':"11111111"}) -
删除:
db.bank_and_security.remove({'资金帐号':"11111111"}) -
更新:
db.bank_and_security.update({'资金帐号':"11111111"}, {'资金帐号':"9999999"}) -
查询:mongoDB 的查询,都有等同 sql 功能的 语句的。https://www.cnblogs.com/hanease/p/16208105.html
- 查询所有记录:db.userInfo.find()
- 指定返回哪些键:db.userInfo.find({},{id:1})
- 条件查询(等于):db.userInfo.find({"age": 22}) 【查询 age = 22 的记录】
- 条件查询(大于):db.userInfo.find({age: {$gt: 22}})【查询 age > 22 的记录】
- 条件查询(in):db.userInfo.find({"author": {"$in": ["a", "b", "c"]}})
- 模糊查询(like):db.userInfo.find({"title": /mongodb/})
- 计数(count):db.article.count()
mongoose库:
mongoose是一个对象文档模型库(即,以对象形式操作数据库)。 mongoose就 是 node操作 mongoDB的一个对象。
注意:mongodb 中不需要建立数据库,当你需要连接的数据库不存在时,会自动创建一个出来。
-
mongoose的好处:
- 可以为文档创建一个模式结构(Schema)。
可以理解为是对文档的约束,因为 MongoDB 本身是没有什么约束的,文档数据可以任意插入。 - 可以对模型中的对象/文档进行验证。
- 数据可以通过类型转换,转换为对象模型。
- 可以使用中间件来应用业务逻辑挂钩
- 可以为文档创建一个模式结构(Schema)。
- mongoose中的对象概念:
- schema(模式对象):schema 是模式结构,就是一种约束结构【可以理解为 定义 表 字段。】 参考链接1、参考链接2
schema可以理解为mongoose对表结构的定义(不仅仅可以定义文档的结构和属性,还可以定义文档的实例方法、静态模型方法、复合索引等),每个schema会映射到mongodb中的一个collection,schema不具备操作数据库的能力。
var studentsSechma=new mongoose.Schema({ name:String, age:Number })
注意:mongoose 中声明字段类型的逻辑
-
mongodb中字段的数据类型就是 在 创建 schema 时确定的。数据到了schema 这里就会根据这里的类型进行一个转化,如果无法正常转化,mongoose就会报错。如:age是一个Number类型,而传进来的是 字母字符串,无法进行转化就会报错。
-
定义数据类型:可以使用类表示,也可以使用字符串表示(字符串表示 全部小写)。有的数据类型,原生js没有对应的类,可以使用mongoose提供的类。如:
const testSchema = new mongoose.Schema({ boolean: { type: Boolean, default: true }, Decimal128: { type: "decimal128", // 字符串表示类型 default: 12 }, Decimal128: { type: mongoose.Schema.Types.Decimal128, // 直接使用 mongoose 提供的类型 类 default: 12 }, })
- mongoose 原生支持的类型只有:String、Number、Date、Buffer、Boolean、Mixed、ObjectId、Array、Decimal128。显然不够,所以官方也提供了自定义type的接口。并且github上也有别人写好的插件可以使用。
-
- Model :model是由schema生成的模型,可以对数据库进行操作。
Model 类 可以 理解为 所有的文档 集合,即 mogoDB 中 集合的概念。每个Model实例,对应的就是一个文档,是真真实实的数据。
创建 Model的语法:mongoose.model(modelName, schema);
var mongoose=require("mongoose"); mongoose.connect("mongodb://localhost/test"); var animalSchema=new mongoose.Schema({ name:String, type:String }); var Animal=mongoose.model("Animal",animalSchema); // mongoose.model() 的第一个参数就是 集合名,返回这个集合的的 Model类(可以看做是一个集合对象)。
注意:1、modelName 就是需要的集合名(即表名),mongoose 会自动讲集合名变成复数(即后面加s)。如果 modelName 大写开头的也会变成小写的。
2、modelName 集合,数据库没有就会自动创建,如果有就返回对应的集合对象,即 Model 类。
下面,使用直接使用 Model 类 向数据库插入文档:Animal.create({ name: 'small' }, function (err, small) { if (err) return handleError(err); // saved! });
我们一般不直接用 Model 类 向数据库插入文档。而是用 Model实体对象 Entity 来插入数据库数据
【个人感悟】Mode 类 就是 一个 集合对象;而 Mode 实例 就是 这个集合下的文档。 - document(文档对象):document对象就是Model的一个实例,使用save方法保存数据,Model和document都能影响数据库的操作,但document更具操作性。
注意:Model是一个类,实例化对象就 是 文档对象。一个 文档对象 就是sql中一条记录。
const sechma = new mongoose.Schema({ name:String, age:Number }) const model = mongoose.model('User', sechma) // 基于 sechma 对象,创建 model对象 const doc= new model(req.body.user) // 实例化一个 Model对象,就创建了 document对象。 doc.save()
MongoDB安装:
- 安装版:这个比较简单,就是普通软件 双击安装就可以了。
MongoDB和Robomongo的安装配置与简单实战 :https://blog.csdn.net/u011684839/article/details/80911732 或 https://www.jianshu.com/p/1c85bf051754 或 https://www.jb51.net/article/149859.htm(推荐这个,这个新版软件的安装方式)
注:MongoDB 新版的已经不支持32位的系统了。所以要安装 win32位 的MongoDB,请参考: - 免安装(推荐):如果不想 使用安装包安装,主要是怕安装时 会把 数据库 配置到window系统服务中。官网下载 zip 压缩包,解压后需要自己做些配置。
安装教程:https://blog.csdn.net/qq_28316065/article/details/102594991(推荐,亲测有效)或 https://www.cnblogs.com/chenyucong/p/6217017.html(亲测有效,免安装的)
1、zip解压后可重命名,解压后文件目录如下
2、在bin同级目录创建一个空文件夹data,作为数据存放路径
3、在bin同级目录创建一个文件夹logs,并在文件夹中创建一个mongo.log文件,存放日志信息
4、在bin同级目录创建一个mongo.conf配置文件,内容如下:【写在 mongo.conf 中,就不需要把配置写在命令上了】#数据库存放路径 dbpath=D:\software\mongodb-6.0.1\data #日志输出文件路径, 路径后面必须是一个文件,不能是一个目录 logpath=D:\software\mongodb-6.0.1\logs\mongo.log
5、在bin目录下 cmd中。输入命令
mongod --dbpath D:\software\mongodb-6.0.1\data
上面的命令可以做出 bat 批处理文件。如下 startup-dbpath.bat文件。
在bin同级目录创建批处理文件startup-conf.bat、startup-dbpath.bat,内容如下# startup-conf.bat 文件 cd bin mongod --config "D:\software\mongodb-6.0.1\mongo.config"
# startup-dbpath.bat 文件 cd bin mongod --dbpath D:\software\mongodb-6.0.1\data
6、启动顺序:双击startup-dbpath.bat(注意此窗口不要关闭),然后使用navicat连接数据库就可以了。
MongoDB的内置角色 https://juejin.cn/post/7165701469159555102
内置角色足够我们使用,不需要另外创建角色
- 数据库读写角色:【程序中只有读写数据库的能力,不可能是给与管理的权限。所以nodejs、java中一般只用这两种权限】
- read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- 数据库管理员角色:
- dbAdmin:允许用户进行索引创建、删除,查看统计或访问 system.profile,但没有角色和用户管理的权限
- dbOwner:提供对数据库执行任何操作的能力。这个角色组合了 readWrite、dbAdmin 和 userAdmin 角色授权的特权
- userAdmin:提供了在当前数据库中创建和修改角色和用户的能力
- 所有数据库角色:【只在 admin 数据库中可用】
- readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
- dbAdminAnyDataBase:只在 admin 数据库中可用,赋予用户所有数据库的 adAdmin 权限
MongoDB设置用户名密码 https://blog.51cto.com/u_12420306/4958284 或 https://www.itcoder.cn/4/39/
【重点先说:mongodb 设置账号密码和mysql不一样,它是可以给每一个数据库都设置一个账号密码的,但是在设置之前,要先给 system 下的 admin 数据库先设置账号密码才可以给其他的数据库设置!这一点很重要,否则会失败!!】
- 切换到admin数据库,给admin 创建 用户密码。【这就是一个超级管理员权限】
说明:必须给admin数据库设置用户密码,因为只有admin数据库的账户才能创建用户。其它数据库账都的都不行。
db.createUser({user: 'root', pwd: '1234', roles: ['root']})
- 接下来就可以给特定数据库设置账号密码了,假如现在有一个数据库,名为:imaiduo,先切换到该数据库下,然后给这个指定数据库创建用户密码
db.createUser({user:"root",pwd:"1234",roles:[{role:"readWrite",db:"imaiduo"}]})
- 以上设置好后,MongoDB 默认是没有开启访问控制权限的,要通过 --auth 参数重启 mongodb 服务,这个时候注意!!要把 win 本地的 mongodb 服务先停用掉!然后来到 bin 目录下:
D:\mongodb\bin>mongod --dbpath D:\mongodb\data --auth # 也可以把这些参数 配置再 文件中。启动时指定 配置文件就可以
- 修改用户密码:https://blog.csdn.net/qq920447939/article/details/82665883
利用db.changeUserPassworddb.changeUserPassword('tank2','123456');
- 删除用户:
# 如果需要删除所有的用户,可以直接这样做: db.system.users.remove({}) # 如果需要删除个某个指定的用户,可以这样做 db.system.users.remove({user:"username"})
mongoose其它注意点:
1、mongoose常用api文档 : https://www.jianshu.com/p/fc11fd1c26f9 或 https://www.cnblogs.com/wx1993/p/5243245.html (两篇文章 结合起来看)
注:Mongoose在创建Model时对Collection的命名策略,和设置的不一定一致。https://www.cnblogs.com/wx1993/p/5243245.html。 解决办法:https://my.oschina.net/baiping/blog/1488806(亲测有效,第三个参数就是实际的集合名)
mongoDB 可视化工具:
1、NoSQLBooster:推荐使用这个
优点:日期时间,可以自己选择哪种格式显示;数字也可以数字千分位显示;JSON数据,可以选择格式化显示。
2、navicat:其次推荐这个。
缺点:连接慢;日期时间,只显示 ISO 格式的时间而非本地时间。
3、MongoDB Compass:官方工具,可操作的功能比较少。基本就是看数据,其它操作不方便。
4、Robo 3T :https://www.cnblogs.com/tugenhua0707/p/9250673.html (推荐用这个)
5、Studio 3T :该公司收购了 Robo 3T。Studio 3T 软件太大了,几百兆。
6、mongdbVue:
7、mongodbmanagerfree:免费版的 不支持 mongodb 6.0以上版本的,学习视频中老师推荐的。https://www.cnblogs.com/ckfuture/p/14342000.html