MongoDB(二)建立更新删除文档

插入并保存文档操做mongodb

用insert向目标集合插入文档,若是没有_id键则会自动添加。最后自动保存。shell

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

若是要批量插入怎么办呢,看下面代码:数据库

>db.foo.insert([{"_id":0},{"_id":1},"{"_id":2}])

之前有一个batchInsert函数,如今已经没有了。注意在批量插入的过程当中若是有一个文档插入失败,则这个文档和他以后的文档都会插入失败。若是想要忽略错误而且继续执行就这么写:数组

db.foo.insert([{"_id":3},{"_id":4},{"_id":3},{"_id":5}],continueOnError=true)

在插入数据的时候,mongoDB只会进行简单的校验:检查文档的基本结构,若是没有_id就自动增长一个。检查大小,全部的文档都得<16MB(设计者认为设定的,之后也可能变)。若是想要查看一个文档的BSON大小,那么能够这么作:服务器

Object.bsonsize({"x":1})

这样就能够得到文档的BSON大小。不知道什么是bson请看这个Bson是什么函数

因为MongoDB只进行最基本的检查,因此插入非法数据很是容易。那么咱们在这个过程当中应该只容许信任的源连接服务器。spa

 

删除文档设计

删除所有文档命令:code

db.foo.remove({})

删除知足特定条件的文档:htm

db.foo.remove({title:"blog"})

这个会删除知足title=blog的文档,咱们也能够只删除一个知足条件的文档:

db.foo.remove({title:"blog"},1)

这个命令会删除第一个知足条件的文档。

在删除所有文档的时候,咱们用drop()直接删除集合会更快,可是drop只能所有删除,并不能指定条件删除!

 

更新文档

用update来更新文档,update有两个参数,一个是查询文档,用于定位须要更新的目标文档;另一个是修改器,用于说明要对找到的文档进行哪些修改.更新操做是不可分割的,若两个更新操做同时发生,那么先到达服务器的先执行,再执行另一个。

1.替换文档

假设咱们以前的文档是{“_id":0,"name":"faner","friends":88,"enemies":2},如今咱们想将friends和enemises两个字段移到子文档relationship中,最简单的方法就是用一个新文档来替换咱们以前的文档那么咱们应该这么作

var faner = db.tester.findOne({name:"faner"});
faner.relationship = {"friends":faner.friends,"enemies":faner.enemies};
delete faner.friends;
delete faner.enemies;
db.tester.update({name:"faner"},faner};

这样咱们就完成了咱们的替换.可是注意若是查询条件匹配到了多个文档,更新时由于第二个参数的缘由会致使全部的_id相同,数据库就会跑出错误,任何文档都不会更新。因此在更新时最好经过惟一键值来指定惟一文档!
好比说_id,而且用_id查询比其余字段快,这是由于索引的关系,咱们暂且不谈。

 

2.使用修改器

若是文档只有一部分要更新,那么咱们可使用原子性(不懂的本身百度吧。毕竟这但是一项基本技能~)的更新修改器,指定对文档的某些字段进行更新。

 db.tester.update({name:"faner"},{$set:{x:22}})

这句话的意思是咱们找到name=faner的文档并把他的x变成22,这里使用了咱们的set修改器.$set修改器用来修改一个字段的值,若是这个字段不存在则会建立它,除了修改值以外咱们还能改变键的类型,以下:

db.tester.update({name:"faner"},{$set:{x:[1,2,3,4]}})

这样咱们把咱们的x变成了一个数组,相应的咱们还能变成内嵌文档以及其余类型,具体的请本身试试。

若是咱们想删除一个键,咱们也能够用$unset来完成咱们的想法:

db.tester.update({name:"faner"},{$unset:{x:1}})

注意这个字段x后面的值无心义,什么均可以,我是习惯写1而已,每一个人根据本身的习惯写本身的代码。

除了咱们的$set和$unset外,咱们还有$inc修改器(自增),$push修改器(向已有的数组末尾加入一个元素)等等.

下面咱们经过代码来看看各个修改器的做用:

 db.tester.update({name:"faner"},{$inc:{x:1}})
//inc修改器用来自增
//$push修改器用来在数组后面增长一个元素
db.tester.update({name:"faner"},{$push:{x:5}})
//push和each结合添加一组元素
 db.tester.update({name:"faner"},{$push:{x:{$each:[6,7,8]}}})
//若是但愿数组的个数是固定的,则用slice 这里假设数组长度固定为10个,这里保留的是最后加进来的10个元素
db.tester.update({name:"faner"},{$push:{x:{$each:[6,7,8],$slice:-10}}})
//若是我想按照某一字段的大小来保留10个值呢,这里就要用到咱们的$sort
//按照字段x的递减顺序排序保留10 个
db.tester.update({name:"faner"},{$push:{x:{$each:[6,7,8],$slice:-10,$sort:{"x":-1}}}})
//若是咱们不想数数组中的数字有重复的就用$addToSet addToSet也能够和each连用
db.tester.update({name:"faner"},{$addToSet:{x:2}})
//删除一个数组中的元素就用$pop 和$pull(删除多个元素)
 db.tester.update({name:"faner"},{$pop:{x:1}}) //从尾部删除一个元素
 db.tester.update({name:"faner"},{$pop:{x:-1}}) //从头部删除一个元素
//对于数组的一部分进行操做用$定位操做符

upsert是一种特殊的更新,要是没有找到符合更新条件的文档,则他会本身建立一个新的文档,找到了就正常更新文档。使用upsert的方式就是在update的第三个参数写成true便可,默认为false。

还有$setOnInsert,它只会在第一次修改时设置,之后的更新他就不会改变。sava函数能进行快速修改,如db.tester.save(x)  sava是一个shell函数,若是文档中含有_id键则会调用upsert,不然会调用insert。

 

更新多个文档

默认状况下,更新只对知足于匹配条件的第一个文档进行更新。若是要更新全部匹配文档,则设置update的第四个参数为true便可.要想知道更新了多少文档科用命令:db.runCommand({getLastError:1})(返回最后一次操做的相关信息,n便是被更新文档的数量)

 

返回被更新的文档

用findAndModify命令来获得被更新的文档,findAndModify定义和做用官方文档

你们本身看官方上的说明,我就不啰嗦了。

相关文章
相关标签/搜索