(第一部分)什么是MongoDB
【第一章】什么是MongoDB
1.1 认识MongoDB
MongoDB是NoSQL数据库中的佼佼者,该数据库基于灵活的JSON文档模型,非常适合敏捷式的快速开发。与此同时,其与生俱来的高可用、高水平扩展能力使得它在处理海量、高并发的数据应用时颇具优势
【第二章】体验MongoDB
2.1 windows下安装MongoDB
设置超级管理员账号密码
db = db.getSiblingDB("admin")
db.createUser({
user:'admin',
pwd:'123456',
roles:[
{role:'clusterAdmin',db:'admin'},
{role:'dbAdminAnyDatabase',db:'admin'},
{role:'userAdminAnyDatabase',db:'admin'},
{role:'readWriteAnyDatabase',db:'admin'},
]})
为数据库设置独立的登录账号
db = db.getSiblingDB("appdb")
db.createUser({
user:'appuser',
pwd:'appuser',
roles:[{role:'dbOwner',db:'appdb'}
]})
开启权限验证
找到MongoDB安装目录下的bin目录中的mongod.cfg文件,开启权限验证功能:
security:
authorization: enabled
重启MongoDB服务
2.2 连接数据库
使用mongo连接数据库,并登录超级管理员账号
// 方式一
mongo
use admin
db.auth('admin', '123456')
// 方式二
mongo admin -u admin -p 123456
(参考与出处:https://blog.csdn.net/hbtj_1216/article/details/120875957)
2.3 插入文档(增)
尝试写入一条数据
use appdb
[shell显示结果]:
switched to db appdb
db.book.insert({
title:"my first book",
publishedDate:new Date(),
tags:["nosql","mongodb"],
type:"technology",
favCount:25,
author:"zale"
})
[shell显示结果]:
WriteResult({ "nInserted" : 1 })
假定你有使用关系型数据库的经验,则可能会记得正确的顺序应该是:
- 创建数据库
- 创建数据表
- 插入数据
然而在MongoDB中,前面的两个步骤都不是必须的,数据库、集合都是动态创建的。在首次写入数据后,我们就可以通过show collections看到对应的集合被生成了,如下:
show collections
[shell显示结果]:
book
写入更多数据
接下来,还可以继续向book集合中写入更多的数据,如下面这段代码:
var allTags = [ "nosql","mongodb","document","developer","popular" ];
var allTypes = [ "technology", "sociality", "travel", "novel", "literature" ];
var books = [];
for (var i=0; i<50; i++){
var typeIdx = Math.floor( Math.random() * allTypes.length );
var tagsIdx = Math.floor( Math.random() * allTags.length );
var maxTagsCount = Math.ceil( Math.random() * allTypes.length);
var favCount = Math.floor(Math.random() * 100 );
var book = {
title: "book-"+ i,
publishedDate: new Date(),
type: allTypes[ typeIdx ],
tags: allTags.slice( tagsIdx,tagsIdx + maxTagsCount ),
favCount: favCount,
author : "zale"
};
books.push(book);
}
[shell显示结果]:
50
db.book.insertMany( books );
[shell显示结果]:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("62a9f663c975dfcc9e32a656"),
ObjectId("62a9f663c975dfcc9e32a657"),
ObjectId("62a9f663c975dfcc9e32a658"),
......
ObjectId("62a9f663c975dfcc9e32a686"),
ObjectId("62a9f663c975dfcc9e32a687")
]
}
2.4 查询文档(查)
2.4.1 查询全部数据
db.collection.find方法可以用于集合数据的查询
db.book.find()
2.4.3 指定数据查询
db.book.find({tags:"mongodb"})
db.book.find({type:"novel",favCount:{$gt:10}})
2.4.3 排序分页
(1)指定排序,此处俺出版时间(publishedDate)降序
db.book.find({type:'novel'}).sort({publishedDate:-1})
(2)分页查询
skip 用于指定跳过记录数,limit则用于限定返回结果数量
可以在执行find命令的同时指定skip、limit参数,以此实现分页的功能。比如,假定每页大小为8条,查询第3页的book文档,代码如下:
db.book.find().skip(16).limit(8)
可以在执行find命令的同时指定skip、limit参数,以此实现分页的功能。比如,假定每页大小为8条,查询第3页的book文档,代码如下:
db.book.findOne()
2.4.4 使用投射
投射(projection)可以让数据库只返回一部分被关注的字段,而不是整个文档。
比如,可以让数据库仅仅返回book文档中的标题(title)、收藏数(favCount)字段,代码如下:
db.book.find( {},{ title: 1,favCout: 1 }).limit(5)
2.4.5 查询限定符
比较操作符:

逻辑操作符:

数组操作符:

2.5 更新文档
2.5.1 update命令
- query:描述更新的查询条件;
- update:描述更新的动作及新的内容;
- options:描述更新的选项。
db.{collection}.update(query,update,options)
1、更新单个文档
db.book.update(
{"_id":ObjectId

浙公网安备 33010602011771号