MongoDB 是一款强大、灵话,且易于扩展的通用型数据库.它能扩展出作常多的功能,如级索引,范围查询,排序,聚合,以及地理空间索引。
- 文档是 MogoDB 中数据的基本单元,非常类似于关系型数据库管理系统中的行, 但更具表现力
- 类似地,集合(collection)可以看作是一个拥有动态模式的表 MongoDB 的一个实例可以拥有多个相互独立的数据库,每一个数据库都拥有自己的集合
- 每一个文档都有一个特殊的键”_id”,这个键在文档所属的集合中是唯一的
- MongoDB 白带了个简单但功能强大的 JavaScriptShell,可用与管理 MongoDB 的实例或数据操作
shell 中的基本操作
1. 创建(insert)
insert 函数可以将一个文档添加到集合中
1 | post = { title: "hello", date: new Date() }; |
2. 读取(find 或 findOne)
find 和 findOne 都可以查询集合里的文档,
findOne 只查询一个文档。
1 | db.test.find(); |
3. 更新(update)
update 修改博客文章,至少接受两个参数
第一个:限定条件(用来匹配待更新的文档)
第二个:新的文档
1 | // 为post增加一个字段 |
4. 删除(remove)
使用 remove 方法可以从数据库删除文档,如果没有使用任何参数,他会删除全部文档,如果接入一个限定条件的文档作为参数他会只删除限定条件的文档。
1 | db.test.remove({ title: "hello" }); |
mongodb 中的基本数据类型
- null
null 用于表示空值或者不存在的字段
布尔值
布尔值有两个值 true 和 false数值
数值可以表示浮点数也可表示整数,使用表示整数时,可以使用 NumberInt 或者 NumberLong 类表示字符串
日期
在创建日期时,应使用 new Date(),而不是 Date()。
因为 new Date()返回的是一个时间对象,Date()返回的是一个字符串,如果不加以约束,后面管理会很混乱正则表达式
数组
mongodb 能分析深入其结构,对其内容做操作内嵌文档
内嵌文档可以使数据组织更加自然对象 id
在一个集合中,每个文档有唯一的:_id
,确保集合中的每个文档都能被唯一标识
不常用:
- 二进制数
- 代码
使用 MongoDB Shell
- 可直接使用 mongo 执行 js 脚本,也可以使用 load 函数执行脚本
- 创建
.mongorc.js
,可用于被频繁加载的文件或者需要开始加载的文件
注意
‘.mongorc.js’在运行 shell 时所在的目录,也就是C:\Users\tfsmy(用户名)
目录
创建更新和删除文档
批量插入
insertMany
1
db.test.insertMany({ _id: 0 }, { _id: 1 }, { _id: 2 });
有条件的删除
remove
,删除整个集合drop
更新文档
update
如果同时更新,先到达服务器的先执行,接着执行另外一个。批量修改时需保持 key 唯一$
修改器:原子性修改,修改某个特定的键值修改器选项
增加和减少
$set
用于修改一个键值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20db.products.update(
{ _id: 100 },
{
$set: {
quantity: 500,
details: { model: "14Q3", make: "xyz" },
tags: ["coats", "outerwear", "clothing"]
}
}
);
// 数组也可以
db.products.update(
{ _id: 100 },
{
\$set: {
"tags.1": "rain gear",
"ratings.0.rating": 2
}
}
);$unset
移除一个键值1
2
3
4db.products.update(
{ sku: "unknown" },
{ $unset: { quantity: "", instock: "" } }
);$inc
用于增加已有键的值,只能用来增加数值,值必须为数字
使用场景:更新分析数据,因果关系,投票,或者其他有变化的数值1
2
3
4
5
db.products.update(
{ sku: "abc123" },
{ $inc: { quantity: -2, "metrics.orders": 1 } }
);
数组修改器
$push
向已有的数组末尾加入一个元素,要是没有就新建一个数组$pop
向已有的数组删除一个元素(val 值为正数则从末尾开始删除,val 为负数则从头部开始删除)$addToSet
向已有的数组末尾加入一个元素(但是可以避免重复),要是没有就新建一个数组,另外addToSet
可以和$each
结合实现添加不同的值1
2
3
4
5
6
7db.inventory.update({ _id: 1 }, { $addToSet: { tags: "camera" } });
//批量增加无重复元素
db.inventory.update(
{ _id: 2 },
{ $addToSet: { tags: { $each: ["camera", "electronics", "accessories"] } } }
);$pull
可以根据具体的值删除数组中的元素1
2
3
4
5
6
7
8
9//单条删除
db.profiles.update({ _id: 1 }, { $pull: { votes: { $gte: 6 } } });
//多条删除
db.survey.update(
{},
{ $pull: { results: { score: 8, item: "B" } } },
{ multi: true }
);$
数组定位修改
如果数组中有多个值,我们想对其中一部分进行操作,就需要用到位置定位操作符,但是只修改第一个被查询到的数组1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16//修改前
db.students.insert([
{ _id: 1, grades: [85, 80, 80] },
{ _id: 2, grades: [88, 90, 92] },
{ _id: 3, grades: [85, 100, 90] }
]);
// 把 id 为 1,greades 中第一个 80 的项做操作
db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
// 结果
{ "_id" : 1, "grades" : [ 85, 82, 80 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
upsert
upsert 是一种特殊的更新,如果没有找到符合更新条件的文档,就会以这个条件和更新文档为基础新建一个新的文档,要实现这种功能,需要把 update 函数第三个参数设置为 true
1 | // 找不到符合条件的文档 |
更新多个文档
上面的一些基本都是更新第一次查找的文档,如果要更新多个文档,只需要把 update 函数第四个参数设置为 true
写入安全机制
- 响应式写入:写入成功后,数据库会给出响应
- 非响应式写入:不返回任何响应