MongoDB数据库入门

MongoDB是一种面向文档的数据库管理系统,用C++等语言撰写而成,以解决应用程序开发社区中的大量现实问题。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB和Node服务器非常的搭配,因为MongoDB存储的数据格式其实就是键值对的形式,和JS中的对象差不多,并且MongoDB的查询语句写起来也跟JavaScript语句差不多。

所以学习MongoDB的成本还是比较低的,当然,这并不意味着Node服务器不能选择其它的数据库,选择什么数据库还是根据实际情况来决定。

为什么使用NoSQL

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL 数据库的发展却能很好的处理这些大的数据。

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

安装MongoDB

因为是学习MongoDB所以我就装在了我的本机上,即Win10。

正常安装

MongoDB下载地址

image-20201011155534442

1、直接在这里选择对应的版本下载即可。

image-20201011155653717

2、在这个界面安装的时候,注意安装的地址不要选择这种有一个空格的文件夹,这可能会导致后面的安装出现问题。

image-20201011155811580

3、到下面的界面一定要把那个勾去掉,因为这是安装一个可视化操作的程序,是要即时从网上下载安装,因为各种原因,下载会非常慢,可能还会出现下载失败的情况。

image-20201011155939134

4、然后继续下一步,如果一路安装成功,那么恭喜你,你的MongoDB已经安装完成。

配置环境变量

安装完成后就要配置环境变量,作为一个程序员来说配置环境变量应该是非常熟悉的:此电脑右键-属性-高级系统设置-环境变量。

找到用户变量中的path双击。新建MongoDB环境变量。最后点击确定,如果你看到的界面不一样,你可能使用的Win7。再这里,强烈推荐开发者使用Win10,因为Win10对于开发者的友好度要远高于Win7。

image-20201011162152158

自动开启服务失败

如果看到下面的提示,那么也别慌,经过一系列的配置后你就可以正常使用MongoDB了。

image-20201011160334823

1、点击Ignore跳过。接下来进入到安装文件夹中:

image-20201011160445197

2、在data文件夹中创建一个db文件夹,在log文件夹中创建一个mongo.log文件,打开CMD命令,运行

mongod --dbpath E:\mongodb\data\db

3、通过浏览器访问http://localhost:27017/如果看到下面的页面,说明一个数据库已经初始化成功了。

image-20201011161550467

4、在根目录下创建一个mongo.config文件然后在该文件中添加下面的代码。

dbpath=D:\mongoDB\data\db

logpath=D:\mongoDB\log\mongo.log

5、以管理员身份运行CMD,运行下面的代码,创建一个MongoDB服务。

mongod --config "D:\mongoDB\mongo.config" --install --serviceName "MongoDB"

6、接下来在服务窗口中找到我们创建的服务,双击:

image-20201011161127142

7、在登录界面选择本地系统账户

image-20201011161229790

8、再到常规界面启动服务。

image-20201011161316750

验证安装

再CMD中输入mongo,如果看到以下的界面:

image-20201011161911555

到这里,MongoDB服务已经正式启动,可以开始接下来的学习了。

权限配置

如果没有权限认证,任何人知道你的IP地址和你的数据库端口号后都可以直接访问你的数据库。

这是一个非常危险的事情,因为任何人都可以直接对你的数据库进行操作,所以这个时候就需要设置权限认证。

创建超级管理员

use admin

db.createUser({user":"账号",pwd:"密码",roles:[{role:"root"}]});

修改配置

找到安装目录下\bin\mongod.cfg

这个是数据库的配置文件。

重启服务

数据操作

数据库

连接数据库

没有设置权限的情况下连接数据库命令:mongo

设置了权限后连接数据库命令:

mongo admin -u userName -p passworld

查看数据库

命令:show dbs

如果是才安装的数据库,那会有如下输出:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

这3个数据库是安装时自动生成的,如果不了解它们是做什么的,那还是不要轻易进行操作。

创建数据库

如果数据库不存在,则创建数据库,否则切换到指定数据库:use DATABASE_NAME。

> use test
switched to db test

插入一条数据

db.collection.insert()

> db.test.insert({name:"测试"})
WriteResult({ "nInserted" : 1 })

# 查看数据库
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

注意:在MongoDB中,集合中必须要有内容集合才会真正的被创建。

删除数据库

db.dropDatebase()

# 首先需要切换到需要删除的数据库中
> use test
switched to db test

# 删除数据库
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }

集合

创建集合

db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

> db.mycol2.insert({"name" : "菜鸟教程"})
> show collections
mycol2
...

查询集合

show collections或者show tables

> show collections
test
> show tables
test

删除一个集合

db.collection.drop():如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

> db.test.drop()
true

# 再查询一下,可以看到集合已经被删除了
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

文档

插入文档

db.collection.insert():若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

> db.test.insert({name:"张三"})
WriteResult({ "nInserted" : 1 })

更新文档

update()

> db.test.update({"name":"张三"},{$set:{name:"李四"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.find()
{ "_id" : ObjectId("5f7d9adf194547819835e5a0"), "name" : "李四" }

以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

db.test.update({"name":"张三"},{$set:{name:"李四"}},{multi:true})

> db.test.update({"name":"张三"},{$set:{name:"李四"}})         ue})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.update({"name":"张三"},{$set:{name:"李四"}},{multi:true})
WriteResult({ "nMatched" : 98, "nUpserted" : 0, "nModified" :  98 })

删除文档

db.collection.remove()

> db.test.remove({name:"李四"})
WriteResult({ "nRemoved" : 100 })

查询文档

db.collection.find()

数据处理

条件操作符

  • (>) 大于 - $gt

  • (<) 小于 - $lt

  • (>=) 大于等于 - $gte

  • (<= ) 小于等于 - $lte

例子:db.col.find({likes : {$gt : 100}}),表示获取 “col” 集合中 “likes” 大于 100 的数据。

分页

如果你需要在MongoDB中读取指定数量的数据记录,那么可以使用.limit().skip()

.limit()db.COLLECTION_NAME.find().limit(NUMBER)

limit方法接收一个数字参数,表示从MongoDB中读取的数据条数。

.skip()db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

这两个方法合起来使用就可以实现分页查询效果。

排序

.sort()

  • 1表示升序
  • -1表示降序

语法:db.COLLECTION_NAME.find().sort({KEY:1})

查找一条数据

  • findOne()

查询优化

如果不设置索引,数据库的查询是非常缓慢的,如果设置了索引,那么查询速度可以提高几十倍。

创建索引

createIndex()

语法:db.collection.createIndex(keys, options)

获取索引

getIndexes()

语法:db.collection.getIndexes()

删除索引

dropIndex()

语法:db.collection.dropIndex()

复合索引

ensureIndex()

db.collection.ensureIndex()

唯一索引

unique:true

聚合管道

$project

$match

$limit

$skip

$sort

$group

$lookup

备份以及还原

参考资料

菜鸟MongoDB教程