03 创建、更新及删除文档

1 插入并保存文档

1
>db.foo.insert({"bar":"baz"}); // 插入一条文档,会自动添加"_id"键

1.1 批量插入

☑ 优点:和多次插入一个文档相比可以减少 TCP 的开销
☑ 限制:最大时 16M (2010年)
☑ 特点:只能插入多个文档到一个集合,不能将一个文档插入到多个集合
☑ 用途:导入数据前,对数据做一些小的修正(转换日期类型或添加自定义的”_id”)
☑ 注意:导入原始数据可以使用命令行工具,如 mongoimport,而不是使用批量插入

1.2 插入:原理和作用

过程
使用的驱动程序将数据转换成BSON
数据库解析 BSON, 检验是否包含 “_id” 键并且文旦不超过 4MB
将文档原样存入数据库
☑ 限制:大于4MB的文档不嫩个存入数据库
☑ 优点:不做更多的校验,因此性能更好;插入时不执行代码,远离注入攻击。
☑ 缺点:允许插入无效数据

细节
--objcheck选项:服务器在插入之前检查文档结构的有效性
Object.bsonsize(doc):在shell中运行,查看doc文档转为 BSON 时的大小

2 删除文档

1
2
>db.users.remove() // 删除users集合中的所有文档,不会删除集合本身和索引,删除集合(然后重建索引)会根块
>db.mailing.list.remove({"opt-out":true}) // 删除mailing.list集合中所有"optout"为true的人

删除速度比较

(一)先插入一百万个虚拟元素

1
2
for i in range(1000000):
collection.insert({"foo":"bar", "baz":i, "z": 10-i})

(二)删除

第一种:删除所有文档

1
2
3
4
5
6
7
8
9
import time
from pymongo import Collection
db = Connectopn().foo
collectopn = db.bar
start = time.time()
collection.remove() "删除文档
collection.find_one()
total = time.time() - start
ptint "%d seconds" % total "46.08seconds

第二种:删除集合

1
db.drop_collection("bar") // 只花了0.1秒

3 更新文档

db.docName.update

用途
☑ 查询文档:找出要更新的文档
☑ 修改器:描述对文档做出哪些更改
特点:原子的,先到达服务器的先执行

3.1 文档替换

☑ 注意:常见错误就是查询条件匹配了多个文档,同事修改器中指定了_id的值,数据库会因为_id重复拒绝修改

案例
修改前

1
2
3
4
5
6
{
"_id":ObjectId("4b2b9f67a1f631733d917a7a"),
"name":"joe",
"friends":32,
"enemies":2
}

修改后

1
2
3
4
5
6
7
8
{
"_id":ObjectId("4b2b9f67a1f631733d917a7a"),
"username":"joe",
"relationships":{
"friends":32,
"enemies":2
}
}

实现
第一步:创建修改器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>var joe = db.users.findOne("name":"joe")
>joe.relationships = {"friend":joe.friends, "enemies":joe.enemies}
{
"friends":32,
"enemies":2
}
>joe.username = joe.name
"joe"
>delete joe.friends
true
>delete joe.enemies
true
>delete joe.name
true

第二步:修改

1
>db.users.update({"name":"joe", joe})

3.2 使用修改器

☑ 更新修改器:一种特殊的键,用来指定复杂的更新操作,比如调整、增加或者删除键
☑ 限制:不能修改_id值
☑ 注意:MongoDB 一开始设计成 JS 数据库,因为 $ 在 JS 中没有特殊含义(历史遗留问题),然而 $ 在 PHP 和 Perl 中有特殊含义

案例:在一个集合中放置用户登录网站的次数信息

修改对象

1
2
3
4
5
{
"_id":ObjectId("4b253b067525f35f94b60a31"),
"url":"www.example.com",
"pageviews":52
}

使用修改器

1
2
3
4
5
6
7
>db.analytics.update({"url":"www.example.com"}, {"$inc":{"pageviews":1}} ) // 创建修改器,该修改器用来使analitics集合中的文档,使得被访问时pageviews每次增加一
>db.analytics.find()
{
"_id":ObjectId("4b253b067525f35f94b60a31"),
"url":"www.example.com",
"pageviews":52
}

1.”$set”修改起入门