您的位置:首页 > 数据库 > Mongodb

《MongoDB权威指南》学习整理----MongoDB文档增加、删除及更新

2014-02-20 13:46 561 查看
下面介绍的是对文档的基本操作以及说明。

插入并保存文档

insert

使用方式:数据库名.集合名.insert(文档对象)

说明:该操作一般会自动的给文档加一个_id属性。

MongoDB中的数据插入操作,只会检查插入的数据是否有_id,以及是否超过4M,然后就将数据以BSON格式直接存入到数据库中,不会执行任何其他操作,这样天生的防止了依赖注入。

save

使用方式:

db.connection.save(docObj)

说明:

save方法与saveOrUpdate的性质一样,通过判断传入参数的_id是否存在决定执行什么操作,当存在_id执行udpate操作,_id不存在执行insert操作。

删除文档

使用方式:数据库名.集合名.remove([文档对象])

说明:Remove()可以接收参数,如果没有参数就是删除集合中所有的文档,但是不会删除集合本身。

同时remove方法可以接收一个查询文档作为可选参数,符合该参数的文档才会被删除。例如:DB.collection.remove({key:value})删除collection集合中的key为value的文档。

如果要删除整个集合,那么最好使用db.drop_collection('集合名')的方式,速度会更快,但是这是对整个集合的删除。

更新文档

mongoDB提供了强大的更新功能,基于update方法,提供了多种更新扩展功能。

更新整个文档

使用方式:数据库名.集合名.update(文档对象,修改后文档)

说明:更新操作是原子性的,不会出现线程安全问题,当两个同时更新时,先到达服务器的先执行,后到达的后执行,最后执行的是最后的结果。

最简单的更新是完全用一个新文档替换历史文档。即update(文档对象,新文档对象)。常见的更新错误,是对多个文档修改,但是update的新文档的_id是唯一的,所以会报错。一个集合中的_id必须唯一。

更复杂、更常见的修改,修改文档的一部分:

更新部分文档(更新修改器)

mongodb提供了专门用来修改文档某一部分属性的:更新修改器。更新修改器是一种特殊的键,用来指定特殊的更新操作,例如增加、删除等。如果不适用更新修改器,那么会直接将目标文档替换为修改后的文档。


'$set'与'$unset'修改器

使用方式:

db.collection.update(docObject,{'$set':{key:value}})或者db.collection.update(docObject,{'$unset',{key,value}})

说明:

该修改器用来修改一个键的值,如果这个键不存在,则创建它并赋值。对添加用户自定义键非常方便。如果要删除某个键,那么使用$unset,来执行要删除的键。


'$inc'修改器

使用方式:

db.collection.update(docOjbect,{'$inc':{key:value}}),value必须是数字,且key对应的也应该是数字,可以是正数也可是负数。

说明:

$inc修改器专门用来修改数字类型(3种类型),增加或减少的作用。同时如果要增加的key不存在于文档中,那么文档会创建新的key来保存value。$inc的value文档中的value必须是数字,可以是正数(增)也可以是负数(减)。


数组修改器

$push
使用方式:

db.collection.update(docObject,{'$push':{key:value}})

说明:

$push修改器,如果指定的键已经存在,该修改器会在数组末尾加入一个元素,如果没有指定的键则创建数组,并将元素添加进数组。

$ne
使用方式:

db.collection.update({key:{'$ne':value}},{'$push':{key:value}})

说明:

$ne修改器,用来判断目标数组中是否存在某元素,与$push结合使用,达到根据元素是否存在决定是否添加数组元素的功能。但是不推荐使用这种方式,推荐使用$addToSet修改器。

$addToSet
使用方式:

db.collection.update(docObject,{'$addToSet':{key:value}})

说明:

$addToSet利用这一个修改器可以直接达到有则不添加元素,没有则添加元素的数组修改操作,比$ne与$push组合使用简单。

$each
使用方式:

db.collection.update(docObject,{'$addToSet':{key:{'$each':[value1,value2,value3]}}})

说明:

$each与$addToSet组合使用可以达到多个元素向数组中添加,并且根据数组用是否有该元素决定添加的目的。

$pop
使用方式:

db.collection.update(docObject,{'$pop':{key:1/-1}})

说明:

$pop修改器,用于从数组中删除元素,当key的value值为1的时候从数组的末尾删除,当key的value值为-1的时候从数组的开头删除。

$pull
使用方式:

db.collection.update(docObject,{'$pull':{key:value}}}

说明:

$pull是根据条件来删除数组中的元素,即删除docObject筛选出的文档中的,key指向的数组中的value元素。当value值不存在的时候$pull修改器不会报错。而且$pull会删除所有匹配到的元素而不一定是一个元素。


数组元素定位修改器

数组元素定位修改器主要是用来定位数组中的某个元素,然后利用上边提到的修改器对该目标元素进行修改。

通过位置
使用方式:

db.collection.update(queryDocuemnt,{修改器:{'数组名.n.数组元素属性':与修改器相应的值}})

db.collection.update({'post':post_id},{'$inc':{'comments.0.votes':1}})

说明:

先根据查询文档对象,查找到目标文档,然后通过修改器,修改该文档中某数组元素中第N个元素的某属性。

定位操作符('$')
使用方式:

db.collection.update(queryDocument,{修改器:{要修改属性:与修改器相应的值}})

db.collection.update({'comments.author':'lijie'},{'$set':{'comments.$.author':'aa'}})

说明:

现根据查询文档对象查找目标文档,然后使用修改对象来修改某个元素,而这里的$实际上代表的是查询文档对象查出来的第一个数组元素。

注意当使用$定位修改器的时候查询文档对象的查询条件一般是基于数组属性(comments就是数组属性)。

定位修改器只会修改符合条件的第一个数组元素。

upsert

使用方式:

db.collection.udpate(queryDoc,updateOpera,booleanupsert)

说明:

upsert是一种特殊的更新。如果没有文档符合更新条件,就根据条件和更新文档创建一个新文档,如果有那么就更新文档。由update方法的第三个参数boolean类型标明是否使用upsert模式。

upsert的有点不仅是减少了代码量,更重要的是,update方法本身是原子性的。

更新多个文档

使用方式:

db.collection.update(queryDoc,updateOpera,booleanupsert,boolean multi)

说明:

默认情况下,mongoDB在update操作的时候只对第一个匹配的文档进行更新,但是如果第四个参数设置为true,那么就是对所有匹配的文档进行更新。

更新查询结果--findAndModify

更新最常见的操作是根据某些条件查询出文档,然后对查询出的文档进行某些更改,如果我们分步进行操作(先查询、然后更改),这样会带来线程安全隐患(具体信息可参考:java中的多线程)。mongoDB为了避免这种问题,为我们提供了原子性的命令findAndModify,下面对findAddModify进行说明。

使用方法:

db.runCommand({'findAndModify':集合名,"query":queryDocObj,"sort":sortDocObj[,"update":updateDocObj][,"remove":booleandeleted]}).value

db.runCommand({'findAndModify':'foo',"query":{'aa':1},"sort":{'sortValue':1},"update":{'$inc':{'value':30}},"remove":true}).value

说明:

findAndModify命令一个速度较慢的原子性操作,它的优点在于是原子性操作,而缺点是运行速度较慢。同时findAndModify可以返回query键查询出的文档结果,也就是没有执行update或remove操作钱的query文档结果,当query对象查询不到文档时会报错。并且update键与remove键有且只能有一个。findAndModify每次只能操作一个文档,也不能执行upsert操作。所以findAndModify最重要的特性就是其原子性,保证线程安全。

 

操作的安全性

以上介绍的insert、remove、update在mongoDB中都称为瞬间完成操作,这些操作的特点是默认情况下,这些操作都不会得到mongoDB的返回值,就会继续去执行其他操作。这虽然会大大提高系统性能,也会带来安全性上的风险。为了保证数据的安全性,我们可以启动mongoDB的安全模式,所谓安全模式,就是mongoDB会在每次瞬间操作之后都会调用getLastError命令等待数据库响应来查看上条命令的执行结果,如果不成功一般会抛出一个可被捕获的异常。

同时,mongoDB会对每个数据库连接创建一个队列,一个队列就像是一个事务,所以不同队列之间的数据查询结果可能不一样。尤其是对于java、python等使用数据库连接池技术的语言。所以使用以上语言驱动mongoDB的时候需要仔细阅读相关的文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mongodb NoSQL 数据库