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定义和作用官方文档
大家自己看官方上的说明,我就不啰嗦了。
MongoDB(二)创建更新删除文档的更多相关文章
- 《mongoDB》基本操作-创建/更新/删除文档
一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo - use db_name; 选择你要操作的集合 > use demo switched to db dem ...
- MongoDB创建\更新\删除文档操作
一.插入\创建文档 --当插入一个不存在的文档时,会自己主动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecti ...
- 2.MongoDB系列之创建更新删除文档
1. 插入文档 // 单条插入 db.getCollection('blog').insertOne({'type': 'mongodb'}) // 批量 插入 db.getCollection('b ...
- sharepoint中的Power Shell命令创建、删除文档库列表
ListTemplateType 枚举: 自定义列表-GenericList.文档库-DocumentLibrary.图片库-PictureLibrary.公告-Announcements.联系人-C ...
- MongoDB(五):更新文档、删除文档
1. 更新文档 MongoDB的uptade()和save()方法用于将集合中的文档更新.update()方法更新现有文档中的值,而save()方法是传递文档数据替换现有文档.从3.2版本开始,Mon ...
- MongoDB学习笔记二:创建、更新及删除文档
插入并保存文档 对目标集使用insert方法插入一个文档: > db.foo.insert({"bar" : "baz"}) 这个操作会给文档增加一个&q ...
- MongoDB学习笔记-创建、更新、删除文档
创建 MongoDB中使用insert方法来向集合插入文档,然后保存到MongoDB中. db.foo.insert({"hehe":"呵呵"} ...
- Mongodb 笔记02 创建、更新和删除文档
创建.更新和删除文档 1. 插入并保存: 1). 单条插入,insert : db.foo.insert({"bar":"baz"}) 2). ...
- 创建、更新、删除文档。 --- Mongodb权威指南阅读。
插入文档: db.foo.insert({ "key" : "value"}); 使用insert插入一个数据,文档中如果没有_id 会自动给文档增加_id. ...
随机推荐
- stylus解决移动端1像素线等问题
引用了yo框架中的_border.scss(用来获取yo框架封装的border) 以及 variables.scss(用来获取媒体查询的规则) border($border-width = 1 ...
- ES6中的Symbol
---恢复内容开始--- Symbol 1.1 概述 保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 在es6之前,JavaScript ...
- [bzoj1860 ZJOI2006] 超级麻将 (线性dp)
传送门 Description Input 第一行一个整数N(N<=100),表示玩了N次超级麻将. 接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量.ai表示数字为i的 ...
- tree:以树形结构显示目录下的内容
tree命令 1.命令详解 [功能说明] tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容包括所有文件.子目录及子目录里的目录和文件. [语法格式] tree [option] ...
- 域名IP绑定
该文为阿里云域名举例 首先具备3个前提: 买服务器并搭建环境:阿里云官网购买阿里云的服务器(我购买的是window系统,ECS服务器). 在自己的云服务器上布置上jdk,配置环境变量:安装上tomca ...
- 松哥整理了 15 道 Spring Boot 高频面试题,看完当面霸
什么是面霸?就是在面试中,神挡杀神佛挡杀佛,见招拆招,面到面试官自惭形秽自叹不如!松哥希望本文能成为你面霸路上的垫脚石! 做 Java 开发,没有人敢小觑 Spring Boot 的重要性,现在出去面 ...
- luogu P4238 多项式求逆 (模板题、FFT)
手动博客搬家: 本文发表于20181125 13:21:46, 原地址https://blog.csdn.net/suncongbo/article/details/84485718 题目链接: ht ...
- Orcale用户管理
类 ------表 对象----行 属性----列 软件开发流程: 需求调研 需求分析 概要分析 详细分析 编码 测试 上线 维护 论坛: 1.注册和登录 2.发帖,回帖(关注,浏览数) 用户:(昵称 ...
- Syncfusion在WinPhone8.1实现统计图
using Syncfusion.UI.Xaml.Charts; public static SfChart InitCompareChart(string fundName, double tenT ...
- 【ACM】poj_2356_Find a multiple_201308061947
Find a multipleTime Limit: 1000MS Memory Limit: 65536K Total Submissions: 4988 Accepted: 2159 Spe ...