专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

MongoDB(2)创建更新删除文档

发布时间:2011-06-29 18:28:35 文章来源:www.iduyao.cn 采编人员:星星草
MongoDB(二)创建更新删除文档

插入并保存文档操作

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

>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只进行最基本的检查,所以插入非法数据非常容易。那么我们在这个过程中应该只允许信任的源链接服务器。

 

删除文档

删除全部文档命令:

db.foo.remove({})

删除满足特定条件的文档:

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定义和作用官方文档

大家自己看官方上的说明,我就不啰嗦了。

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: