码迷,mamicode.com
首页 > 数据库 > 详细

MongoDB创建、更新及删除文档

时间:2016-03-10 23:26:40      阅读:400      评论:0      收藏:0      [点我收藏+]

标签:

1.1插入并保存文档

插入是向MongoDB中添加数据的基本方法。对目标机使用insert方法,插入一个文档:

> db.foo.insert({"bar" : "baz"})

这个操作会给文档增加一个"_id"键(要是原来没有的话),然后将其保存到MongoDB中。

1.1.1 批量插入

如果要插入多个文档,使用批量插入会快一些。批量插入能传递一个由文档构成的数组给数据库。只有插入多个文档到一个集合的时候,这种方式才会有用,而不能批量插入一次对多个集合执行操作。要是只是导入原始数据(如从数据feed或Mysql中导入),可以使用命令行工具,如mongoimport,而不是使用批量插入,批量插入的时候对消息的长度有限制。

1.1.2 插入:原理和作用

当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送人数据库。数据库解析BSON,检验是否包含“_id”键并且文档不超过4MB,其他不做别的数据验证,只是简单将文档原样存入数据库。这样有好有坏,最明显的副作用就是允许无效的数据插入,好处是它能让数据库更加安全,远离注入式攻击。因为插入时并不执行代码,所以没有这块没有注入式攻击的可能。传统的注入式攻击对Mongodb来说无效。

 1.2 删除文档

删除现有数据库中的数据:

> db.users.remove()

上述命令删除users集合中所有文档。但不会删除集合本身,原有索引也会保留。remove函数可以接受一个查询文档作为参数。给定这个参数后,只有符合条件的文档才被删除。如:要删除mailing.list集合中所有“optout”为true的人:

> db.mailing.list.remove({optout:true})

删除数据是永久性的,不能撤销,也不能删除。

删除文档通常会很快,但是要清除整个集合,直接删除集合(然后重建索引)会更快。

1.3 更新文档

使用update方法修改文档。update有两个参数,一个是查询文档,用来找出来要更新的文档,另一个是修改器(modifier)文档,描述对找到的文档做哪些修改。

更新是原子的:若是两个更新同时发生,先到达服务器的先执行,接着执行另一个,所以,互相有冲突的更新可以火速传递,并不会互相干扰:最后的更新会取得“胜利”。

1.3.1 文档替换

技术分享

变成下面这样:

技术分享

可以用update来替换文档:

技术分享

常见错误就是查询条件匹配了多个文档,然后更新的时候由于第二个参数的存在就产生重复的“_id”值。数据库会报错,不做任何修改。(除了shell外,一般程序不会报错,除非用getLastError)

为了避免这种情况,最好确保更新总是指定唯一文档,如通过像“_id”这样的键来匹配。

1.3.2 使用修改器

通常文档只会有一部分要更新。利用原子的更新修改器,可以使得这种部分更新极为高效。更新修改器是种特殊的键,用来指定复杂的更新操作,如调整,增加或删除键,还可以是操作数组或者内嵌文档。

例如要记录网站访问情况,当有人访问的时候,就要增加计数器,可以使用更新修改器原子性地完成这个增加:

技术分享

在php中,$表示变量前缀,在双引号中以$开头的字符串都会替换成变量,可以转义$:"\$foo"。也可以使用单引号‘$foo‘,就不会解释变量。还可以设置php.ini文件的mongo.cmd_char,可以用=,:,?或者任何你觉得可以替代$的字符都可以。如选择~,就可以用~inc当作\$inc。

使用修改器时,“_id”的值不能改变。(注意,整个文档替换时是可以改变“_id”的。)其他键值,包括其他唯一索引的键,都是可以更改的。

1.“$set”修改器

“$set”用来指定一个键的值。如果这个键不存在,则创建它。这对更新模式或者增加用户定义键来说非常方便。

技术分享

上述文档想要添加喜欢的书籍进去,可以使用“$set”:

技术分享

要是用户觉得喜欢的其实是另外一本书,"$set"又能帮上忙:

技术分享

"$set"修改数据类型,如用户喜欢的是一堆书,可以将“favorite”键的值变成一个数组

技术分享

如果用户突然发现自己不爱读书,可以用“$unset”将键完全删除:

技术分享

也可以用“$set”修改内嵌文档:

技术分享

2.增加和减少

“$inc”修改器来增加已有键的值,或者在键不存在的时创建一个键。对于分析数据,因果关系,投票或者其他数值变化的地方,使用这个都会非常方便。

如游戏集合,如果小球撞到砖块,给玩家加分,这里基数给50,可以使用“$inc”修改器给玩家加50分:

分数键(score)原来并不存在,所以“$inc”创建了这个键,并把值设定成增加量:50。

技术分享

“$inc”和"$set"的用法类似,就是专门用来增加(和减少)数字的。“$inc”只能用于整数,长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败,其中包括很多语言会自动转换成数字的类型,如null,布尔类型或数字构成的字符串。

“$inc”键的值必须为数字。不能使用字符串,数组或其他非数字的值。否则提示如下错误:

技术分享

3.数组修改器

 数组操作,只能用在值为数组的键上。如不能对整数做push,也不能对字符串做pop。使用“$set”或“$inc”来修改标量值。

如果指定键已存在,“$push”会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。

技术分享

要想添加一条评论,可以使用“$push”:

技术分享

经常有这种情况,一个值不在数组里面就把它加进去。可以在查询文档中用“$ne”来实现,如:要是作者不在引文中就添加进去:

技术分享

也可以用“$addToSet”完成同样的事,要知道有些情况“$ne”根本行不通,有时候更适合用“$addToSet”。

技术分享

技术分享

将“$addToSet”和“$each”组合起来,可以添加多个不同的值,而用“$ne”和“$push”组合就不能实现。

技术分享

有几个从数组删除元素的方法,若把数组看成队列和栈,可以用“$pop”,这个修改器可以从数组任何一端删除元素。{$pop:{key:1}}从数组末尾删除一个元素,{$pop:{key:-1}}则从头部删除。

技术分享

有时候要特定条件删除元素,不仅是依据位置,“$pull”可以做到。如下:

技术分享

“$pull”会将所有匹配的部分删掉。对数组[1,1,2,1]执行pull 1,得到结果就是只有一个元素的数组[2]。

4.数组的定位修改器

 

MongoDB创建、更新及删除文档

标签:

原文地址:http://www.cnblogs.com/gimin/p/5256317.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!