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。
正常安装
1、直接在这里选择对应的版本下载即可。
2、在这个界面安装的时候,注意安装的地址不要选择这种有一个空格的文件夹,这可能会导致后面的安装出现问题。
3、到下面的界面一定要把那个勾去掉,因为这是安装一个可视化操作的程序,是要即时从网上下载安装,因为各种原因,下载会非常慢,可能还会出现下载失败的情况。
4、然后继续下一步,如果一路安装成功,那么恭喜你,你的MongoDB已经安装完成。
配置环境变量
安装完成后就要配置环境变量,作为一个程序员来说配置环境变量应该是非常熟悉的:此电脑右键-属性-高级系统设置-环境变量。
找到用户变量中的path双击。新建MongoDB环境变量。最后点击确定,如果你看到的界面不一样,你可能使用的Win7。再这里,强烈推荐开发者使用Win10,因为Win10对于开发者的友好度要远高于Win7。
自动开启服务失败
如果看到下面的提示,那么也别慌,经过一系列的配置后你就可以正常使用MongoDB了。
1、点击Ignore跳过。接下来进入到安装文件夹中:
2、在data文件夹中创建一个db文件夹,在log文件夹中创建一个mongo.log文件,打开CMD命令,运行
mongod --dbpath E:\mongodb\data\db
3、通过浏览器访问http://localhost:27017/
如果看到下面的页面,说明一个数据库已经初始化成功了。
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、接下来在服务窗口中找到我们创建的服务,双击:
7、在登录界面选择本地系统账户。
8、再到常规界面启动服务。
验证安装
再CMD中输入mongo,如果看到以下的界面:
到这里,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
备份以及还原
参考资料
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!