MongoDB 是由C++编写的,是一个基于分布式文件存储的开源NoSql数据库系统。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
本文只是简单入门,更具体更深入知识点一定要查阅👉中文官方文档,这个有点旧了!官方文档,外网半天打不开!
补录Node.js中使用MongoDB的博文:我刚写好的《Node.js集成MongoDB之MongoClient与模块化》和《Node.js集成MongoDB之Mongoose详细入门》
1️⃣入门
1.1❀ 简介
- MongoDB 是一个面向文档存储的数据库
面向文档,意味着不需要行列式的表格字段约束。面向文档的数据库主要设计用来存储、获取以及管理基于文档的或者叫半结构化的数据。数据存储的最小单位是文档,同一个集合中(等同关系数据库的表)中存储的文档属性可以是不同的。 - MongoDB将存储的是‘BSON’的类JSON数据
MongoDB将数据存储为一个文档,数据结构由键值对组成,字段值可以包含其他文档,数组及文档数组。
{
"name": "Joe",
"age": 24,
"likes": ["money", "beauty"],
"contact": {
"phone": {
"type": "cell",
"number": "111-222-3333"
}
}
}
- MongoDB具有高可用性和灵活的水平可伸缩性
MongoDB可以通过复制副本集(数据冗余)保证数据安全性,通过增加节点提高服务器的性能(分片、分布式) - MongoDB提供高性能的数据持久性
嵌入式文档和数组减少了昂贵连接的需求(不需要使用类似关系数据库的join)——减少了数据库系统上的I / O活动。
索引支持更快的查询,并且可以包括来自嵌入式文档和数组的键。 - MongoDB具有丰富的查询语言
- 丝毫不逊色于关系数据库的读写操作(CRUD)
- 数据聚合(aggregate)
- 文本搜索(Text Search)和地理空间查询(Geospatial Queries) - MongoDB Shell 是 MongoDB 自带的交互式 Javascript shell,用来对 MongoDB 进行操作和管理的交互式环境。
可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持多种存储引擎
- WiredTiger存储引擎(包括对静态加密的支持 )
- In-Memory存储引擎
1.2❀ 安装
mongoDB分企业版和社区版,👉软件下载地址,外网下载速度很慢的。以下是我下载好4.4版本安装包的网盘链接,提取码:QQ66 ,里面同时包含了mongoDB官方图形界面化工具Compass.
只做windows版本和ubuntu安装说明,其他linux发行版安装自行查看官网。
windows
1.去掉安装Install MongoDB Compass选项
2.添加全局环境变量
这样就随意在命令行使用mongo命令了
Ubuntu18.04
可以直接从Ubuntu自带软件仓库安装(但不是最新的版本),以下是安装最新版本的方法。注意:这是我自己服务器,最高权限用户。
1.进入官网下载,一定要选准tgz 不要手误选了Shell(tgz),不然你会后悔的,老折磨人了。然后Copy Link
2.下载并解压MongoDB并移到约定俗成的存放软件的目录下
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.4.3.tgz
tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.4.3.tgz
mv mongodb-linux-x86_64-ubuntu1804-4.4.3 /usr/local/mongodb
3.配置环境变量
在/etc/profile最后添加PATH="$PATH:新路径"。
vim /etc/profile
末尾加入 export PATH="$PATH:/usr/local/mongodb/bin"
保存后让其生效
source /etc/profile
验证
echo $PATH
4.创建存放数据库数据和日志的文件夹
mkdir -p /var/db/mongodb
mkdir /var/log/mongodb
5.添加启动配置文件 (不是必须,但不这么做,每次启动就得在命令行输入一大串配置)
cd /usr/local/mongodb/bin
vim mongodb.conf
添加以下内容并保存
dbpath=/var/db/mongodb #数据文件存放目录
logpath=/var/log/mongodb/mongodb.log #日志文件存放目录
port=27017 #端口
fork=true #以守护程序的方式启用,即在后台运行
logappend=true #使用追加方式写日志
directoryperdb=true #设置每个数据库保存在一个单独的目录
bind_ip=0.0.0.0 #将mongodb绑定到任意IP上,来支持远程访问
auth=false #取消账户认证
6.以配置文件方法启动mongoDB服务
mongod -f /usr/local/mongodb/bin/mongodb.conf
再去看下日志
可见启动成功,等待连接
7.mongo连接
不带参数则默认 --port 27017 ip:localhost
mongo
1.3❀ 部分文件说明
1.4❀ MongoDB Compass
连接数据库
保留的数据库
以上三个即是MongoDB保留的数据库,具体作用:看2.2.1
2️⃣概念解析
2.1❀ 传统关系型数据库与MongoDB术语对比
SQL术语 | MongoDB术语 |
---|---|
database(数据库) | database(数据库) |
table(数据表) | collection(集合) |
row(数据行) | document(文档) |
colunm(字段) | field(字段) |
index(索引) | index(索引) |
2.2❀ 概念
2.2.1 ✿ 数据库
一个服务器实例可以运行多个MongoDB实例,每个MongoDB的实例都可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限,不同的数据库也放置在不同的文件中。
数据库名要求:1.应该全部小写 2.尽量不包含特殊字符
保留的数据库
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。还有一个特殊的数据库:test(MongoDB默认的数据库 看3.1)
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
2.2.2 ✿ 集合collection
MongoDB的集合可以看作关系数据库中的表,用于存放一组数据,但是MongoDB和SQL数据库有一个最大的区别:
- 关系数据库的数据是结构化的,需要先定义表结构(schema)才能插入数据,要求每个数据行的结构一致。
- MongoDB的数据是非结构化的,不需要定义表,每个数据(文档)之间的结构也不要求一致。
集合名命名规则:
- 不能以“system.”开头,这是为MongoDB系统保留的前缀
- 不要用特殊的字符,比如‘\0’(空字符)、$等等,一句话,不要搞那些花里胡哨的
2.2.3 ✿ 文档document
MongoDB中同一个集合的文档,结构不要求一致——不需要设置相同的字段,并且相同的字段不需要相同的数据类型。
- 文档中的键值对是有序的。
- 文档支持丰富的数据类型,包含简单类型甚至嵌套文档。
- 文档不能有重复的键。
- 文档区分数据类型和字母大小写。
文档键名规范:不要用特殊的字符,不要搞那些花里胡哨的
- 键名不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 不建议键名以下划线开头,这个是MongoDB保留的。
文档支持的数据类型:
ObjectId
在MongoDB中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档省略了该_id字段,则MongoDB驱动程序会自动为该字段生成一个ObjectId_id。
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes(1字节为8bit 转为16就是2单位数值),含义是:
- 前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
- 接下来的 3 个字节是机器标识码
- 紧接的两个字节由进程 id 组成 PID
- 最后三个字节是随机数
为此我们可以通过getTimestamp 函数来获取文档的创建时间:
3️⃣CRUD
温馨提示:在mongo shell中可以使用javascript脚本,使用TAB键可以补全mongo内置方法,如果存在候选项,请按两次TAB键,与linux shell相似。
3.1❀ 数据库
1.创建数据库或切换数据库
use DATABASE_NAME
use 不存在则创建新数据库,名称为DATABASE_NAME(此时数据库没有内容,查看数据库列表是看不到该数据库的);存在则切换到对应名称的数据库。
2.删除数据库
进入数据库,然后执行删库方法。(一定要慎用,没做备份的话,直接凉凉)
use xxDB
db.dropDatabase()
3.查看数据库
show dbs //查看所有数据库
db //查看当前数据库名称
MongoDB默认数据库:test
进入mongo终端,没选择库,所有的操作都是对test库进行操作的。假如你的test数据库还没有内容,是不会出现在数据库列表的。
在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
3.2❀ 集合
1.创建集合
显示创建集合:
db.createCollection(name, options) //options是可选的
options:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
在 MongoDB 中,你不需要显示创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.xxcollection.insert({"xx":"xxx"})
如此,便会自动创建xxcollection
2.删除集合
show collections
3.查看数据库集合
3.3❀ 文档
document是一种类JSON得数据结构BSON,上文有说明。
1.插入文档
db.collection.insert(document) //将一个或多个文档插入到集合中。
db.collection.insertOne( <document>,{ writeConcern: <document>})//将单个文档插入集合中。 后面参数是可选的
db.collection.insertMany( //将多个文档插入到集合中。 后面参数是可选的
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
- writeConcern:(可选的)写入策略,描述了MongoDB请求对独立mongod或副本集或分片群集进行写操作的确认级别。可以用来设置超时写入处理,复制集写入几个算成功!具体看:【writeConcern】
- ordered:(可选的)指定是否按顺序写入,默认 true,按顺序写入。
2.查询文档
db.collection.find(query,projection) //参数都是可选的,但是第二个参数依赖于第一个参数,不能单独出现
- query 查询对象(条件)
- projection 指定查询的键(需要显示的 1:强调显示 0:强调不显示)。默认返回全部键。
🌰看个查询例子
user集合数据:
GUI 更直观点
查询条件:db.user.find({age:{$gt:"22"}},{job:0}).skip(1).limit(3).sort({age:1})
等价于sql中
SELECT id,name,age,city,sex FROM `user` WHERE age>22 ORDER BY age ASC LIMIT 1,3
query 查询语法:
1.比较操作符
表达式 | 说明 | 示例 |
---|---|---|
{key:value} | 等于 | db.user.find({age:22}) |
{key:{$lt:value}} | 小于 | db.user.find({age:{$lt:22}}) |
{key:{$lte:value}} | 小于等于 | db.user.find({age:{$lte:22}}) |
{key:{$gt:value}} | 大于 | db.user.find({age:{$gt:22}}) |
{key:{$gte:value}} | 大于等于 | db.user.find({age:{$gte:22}}) |
{key:{$ne:value}} | 不等于 | db.user.find({age:{$ne:22}}) |
2.逻辑运算符
(1)$and
同时满足
db.user.find({$and: [{city:"GZ"},{sex:"male"}]})
等价 以下简写
db.user.find({city:"GZ",sex:"male"}) //同时满足city为GZ sex为male条件
(2)$or
至少满足一个条件
db.user.find({$or: [{city:"GZ"},{sex:"male"}]})
(3)$in
判断是否存在于集合中
查找集合中age为2和3的文档
db.animals.find({age:{$in:[2,3]}} )
projection 键查询:
参数依赖于query参数,不能单独出现。
默认全部键都返回,给指定键名设置1:则只查询该键名,设置0:除了该键其它都返回
db.user.find({age:{$gt:"22"}},{job:0})
分页查询:
db.collection.find().limit(LIMIT).skip(SKIP)
LIMIT(int):限制返回的文档数量
SKIP(int):需要跳过的文档数量
统计文档数量count():
db.collection.count(query)
排序:
db.collection.find().sort(SORT)
SORT: BSON对象 key:字段名 value: 1:升序 -1:降序
查询嵌入文档:
键名需要""
包起来,键与键之间要使用.
连接
db.collection.find({"key1.key2" 比较运算符 value})
模糊查询 正则表达式查询
$regex 使用正则表达式
查找name包含dog的文档,忽略大小写
db.animals.find({name:{$regex: /dog/i}})
查找字段为指定数据类型的记录
$type 指定数据类型
查找name为字符串类型的文档
db.animals.find({name:{$type:2}})
类型与数值对应表
3.修改(更新)文档
db.collection.update(query,update,options)
以下是新版本 有兴趣自行了解👉[官网](https://docs.mongodb.com/manual/tutorial/update-documents/)
db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <update>, <options>)
query:查询条件
update:需要更新的数据。将满足查询条件的文档替换成update的数据。
options:可选项
- upsert:布尔值,如果未查询到需要更新的数据,是否将update参数作为新文档插入集合中,默认false
- multi:布尔值,默认只更新第一条满足查询条件的文档,设为true,则更新全部满足条件的文档
- writeConcern: 抛出异常的级别
更换指定字段的值
$set 指定更换的字段
db.animals.update({type:"cat"},{$set:{sound:"miaomiao"}},{multi:true}) //multi不是必须的
替换整条文档
不通过修改器直接置换
db.animals.update({type:"cat"},{sound:"miaomiao"},{multi:true})//multi不是必须的
假如没有使用$set,则是直接将所有符合查询条件的文档置换成<update>
给文档增加字段
设置upsert为真,假如文档没有这个字段,就会附加进去
db.animals.update({type:"cat"},{$set:{sound:"miaomiao"}},{upsert:true})
删除文档字段
$unset用来删除Key(field)的
db.animals.update({name:"catB"},{$unset:{name:"catB"}})
将name为catB的文档的name为catB的字段删除
给文档指定字段加减数值
$inc 将查询到的结果 加上某一个值(可以是负数) 然后保存
db.animals.updateMany({type:"dog"},{$inc:{age:5}})
4.删除文档
db.collection.remove(query,options) //官方已经不推崇这个,为了降低学习成本,我暂时学这个。其实差不多,主要更加语义化和加强可选参数
[新版本](https://docs.mongodb.com/manual/crud/#delete-operations)
db.collection.deleteOne(<filter>,<options>)
db.collection.deleteMany(<filter>,<options>)
options
- justOne:(可选)如果设为 true ,则只删除一个文档,否则删除所有匹配条件的文档,默认false
- writeConcern :(可选)抛出异常的级别。
remove() 方法 并不会真正释放空间。需要继续执行 db.runCommand({repairDatabase:1})
来回收磁盘空间。repairDatabase期间会产生锁,建议关闭应用后再进行此操作
3.4❀ 索引
索引是一个大课题,可惜目前我没有太多时间探索,现在我要投入别的学习中,估计半年后才有时间了,希望到时候记得补上索引的独立篇章博客。我简单介绍下索引:(以下是针对关系数据库的,但是思路都一样,只是个别专有词汇自行转成相对应的即可,比如列表->集合)
- 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度
- 索引需要占用磁盘空间,而且相当大,随存放的文档量增长。
- 创建索引时需要对表加锁,因此实际操作中需要在业务空闲期间进行
- 数据量少(1000以下)的时候尽可能不要建立索引,可能还会使性能下降
索引失效情况,索引建议什么时候用等等,原理又是什么!可以延伸出很多…
创建索引
db.collection.createIndex(indexes,options)
有点抽象 直接看个例子 在后台创建复合索引,按照name升序,age降序
db.animals.createIndex({name:1,age:-1},{background:true})
options:详看 官网
- background:建索引过程会阻塞其它数据库操作,background设置为true以后台方式创建索引,服务依旧可用,默认false。
- unique:设为true,建立唯一索引,默认false
- name:索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
- weights:索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
- expireAfterSeconds:指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
查看集合的索引
db.collection.getIndexes()
查看索引占用空间大小
db.collection.totalIndexSize()
删除集合所有索引
db.collection.dropIndexes()
删除集合指定索引
db.collection.dropIndex("索引名称")
4️⃣数据库连接
标准的URI语法:(主要用来对接其他服务时候使用,在MongoDB Shell中则作为mongo 的执行参数)
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
这一串正则表达式看着头皮发麻,可以直接看下面调用就好了。
连接到本地服务
mongo //默认连接到localhost:27017
mongo --port 27018 //修改默认连接端口,连接到localhost:27018 假如mongodb服务不是在27018启动的 则连接报错,需要确保指定端口有mongodb服务在运行
//数据库设置了登录认证时候 用户名admin 密码123456 登录 当然登录认证也可以放在进入服务后再认证
//供其他服务连接时
mongodb://admin:123456@localhost/
// Shell连接
mongo "mongodb://admin:123456@localhost/"
连接到库
//连接到test库
//供其他服务连接时
mongodb://admin:123456@localhost/test
// Shell连接
mongo "mongodb://admin:123456@localhost/test"
连接复制集
//指定复制集的成员并将复制集命名为replA
"mongodb://mongodb0.example.com.local:27017,mongodb1.example.com.local:27017,mongodb2.example.com.local:27017/?replicaSet=replA"
mongo "mongodb://mongodb0.example.com.local:27017,mongodb1.example.com.local:27017,mongodb2.example.com.local:27017/?replicaSet=replA"
连接主从复制集
//连接复制集三台服务器,在主服务器写入,在从服务器读取(查询)。
mongodb://host1,host2,host3/?slaveOk=true
mongo "mongodb://host1,host2,host3/?slaveOk=true"
直连复制集第一个服务器
//连接到host1 无视是否设置主从
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
安全模式连接
以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
连接远程mongoDB服务
1.确保远程mongoDB服务可访问
2.mongo "mongodb://www.ivotoo.com:27017"
5️⃣ 用户权限
安装好的MongoDB,默认是【非授权模式】(也就是不需要任何权限验证、不需要验证账户,直接在命令窗口中输入 mongo 回车,就可以进行相关操作),这是非常不安全的(比如第四章最后一个例子,随便一个人都可以连上我的数据库了,所以不会让你们的得逞的)!!
为了数据的安全,我们都应该去配置数据库的访问权限 和 修改默认(mongodb://127.0.0.1:27017)连接绑定IP 和 端口号!!
MongoDB是基于角色的访问控制,所以创建用户需要指定用户的角色。启用访问控制,进行登录用户验证,这样创建用户才有意义。
5.1❀ MongoDB数据库中的内置角色
(1)、【数据库用户角色】针对每一个数据库进行控制。
read:提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite:包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.
(2)、【数据库管理角色】每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。
(3)、【集群管理权限】admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。
(4)、【所有数据库角色】
admin:数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
(5)、【超级管理员权限】
root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。
(6)、【备份恢复角色】
backup:数据库备份
restore:数据库恢复
(7)、【内部角色】
__system
5.2❀ MongoDB数据库账户配置常用命令
常用命令
# 查看当前数据库中的用户
show users
或:db.getUsers()
# 登录认证
db.auth("admin", "123456")
# 创建用户
db.createUser({
user:"admin", // 用户名
pwd:"123456", // 密码
roles:["root"] // 角色
})
# 修改用户密码
db.updateUser( "admin", {
pwd: "abc666"
})
# 删除用户
db.dropUser("admin") // admin 是要删除的用户名
创建超管用户
//admin数据库是用来配置账号权限等的
> use admin
switched to db admin
//创建超级管理员,可以做任何操作。
> db.createUser({user:"root",pwd:"xxx",roles:["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
// 创建管理用户
>db.createUser({user:"Joe",pwd:"xxx",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
"user" : "Joe",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
5.3❀ MongoDB服务启用认证(linux window 忘记密码?)
认证可以进入数据库后再使用db.auth(user,pwd)
认证,也可以直接在启动mongo时候加入命令行参数 -u user -p pwd
ubuntu
此时,已经为数据库有加入了账户。
1.服务启动配置文件
mongodb.conf
dbpath=/var/db/mongodb #数据文件存放目录
logpath=/var/log/mongodb/mongodb.log #日志文件存放目录
port=27017 #端口
fork=true #以守护程序的方式启用,即在后台运行
logappend=true #使用追加方式写日志
directoryperdb=true #设置每个数据库保存在一个单独的目录
bind_ip=0.0.0.0 #将mongodb绑定到任意IP上,来支持远程访问
auth=true #开启账户认证
2.重启mongodb服务
杀掉mongodb服务进程
方式一:db.auth(user,pwd)
使用此方法必须进入admin库才能认证
方式二:mongo -u user -p pwd
window
1.修改安装目录bin目录下的mongod.cfg,开启认证
#security:
改成
security:
authorization: enabled
务必确保设置里账户后再重启服务,不然重启不了(反正我电脑就是这样)!
2.重启mongodb服务
3.使用db,auth(user,pwd)
进入admin库认证或者直接mongo -u user -p pwd
忘记密码怎么办?
将配置文件的认证字段注释,然后重启服务,mongo进入admin库 ,查看拥有的账户,根据用户名直接修改用户的密码即可。
补录Node.js中使用MongoDB的博文:我刚写好的《Node.js集成MongoDB之MongoClient与模块化》和《Node.js集成MongoDB之Mongoose详细入门》
参考文档:
mongoDB官方文档
mongoDb菜鸟教程
mongodb入门
Ubuntu安装MongoDB4.0
=============================================================================================
至此,都只是简单的入门,mongodb还有很多知识点,分片,复制集,备份恢复,事务等等,切勿感觉懂得不少了!但是只要脑海有这些概念,以后回想起来会立即定位到这些知识点的然后展开学习即可。数据库目前不是我主攻方向,只做了解,所以暂时没有太多时间容我深入学习后总结,以后有时间会补上。