创建 更新和删除文档

插入并保存文档

插入数据可以使用insert方法向目标集合插入一个文档。

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

批量插入

批量插入使用batchInsert函数实现批量插入,它与insert函数非常像,只是它接受的是一个文档数组作为参数。

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

插入校验

插入数据时,MongoDB只对数据进行基本的检查:
如果没有"_id"字段,就自动增加一个;
所有文档都必须小于16M。

删除文档

db.foo.remove()

更新文档

使用update来更新数据库中的文档。
“$set”修改器

“$set”用来指定一个字段的值,如果这个字段不存在,则可以创建它。
使用“$unset”则可以直接删除这个字段和相应的值。
删除数据是永久性的,不能撤销,也不能恢复。 删除文档通常很快,但是如果要清空整个集合,那么使用drop直接删除集合会更快(然后在这个空集合上重建各项索引)。

增加和修改

“$inc”修改器用来增加已有的键的值,或者该键不存在那就创建一个。对于更新分析数据,因果关系,投票或者其他由变化数值的地方,只用这个都会非常的方便。
"$inc"和“$set”的用法类似,就是专门来增加(和减少)数字的。“$inc”只能用于整形,长整形或双精度浮点型的值。要是用在其他类型的数据上就会导致操作失败,例如null,布尔型以及数字构成的字符串。

添加元素

“$push”会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。
将数组做俄日数据集来使用

你可能想将数组作为数据集使用,保证数组中的元素不会重复。可以在查询文档中用“$ne”来实现。

删除元素

有几个从数组中删除元素的方法。若是把数组看成是队列或者栈,可以用“$pop”,这个修改器可以从数组的任何一端删除元素。{"$pop":{"key":1}} 从数组末尾删除一个元素, {"$pop":{"key":-1}} 则从头部删除。
“$pull”会将所有匹配的文档删除,而不是只删除一个。
修改器的速度

有的修改器运行速度比较块。$inc能就地修改,因为不需要改编文档的大小,只需要将键的值修改一下(对文档的大小的改变),所以非常的块。而数组修改器可能会改变文档的大小,就会慢一些。
将文档插入到MongoDB中时,依次插入的文档在磁盘上的位置是相邻的。因此如果一个文档变大了,原先的位置就放不了这个文档,这个文档就会被移动到集合中的另一个位置。

upsert

upsert是一种特殊的更新。要是没有找到符合条件的更新的文档,就会以这个条件和更新文档为基础创建一个新的文档。upsert非常方便,不必预置集合,同一套代码既可以用于创建新的文档又可以用于更新文档。
更新多个文档

默认情况下,更新只能对符合匹配条件的第一个文档进行操作。要是有多个文档符合条件,只有第一个文档会被更新,其他文档不会发生变化。要更新所有匹配的文档,可以将update的第4个参数设置为true。
返回被更新的文档

调用getLastError仅能够获得关于更新的有限信息,并不能返回被更新的文档。可以通过findAndModify命令得到被更新的文档。这对于操作队列以及执行其他需要进行原子性取值和赋值。
findAndModify命令有很多可以使用的字段:
findAndModify 字符串,集合名
query 查询文档,用于检索文档的条件
sort 排序结果的条件
update 修改器文档,用于对匹配的文档进行更新
remove 布尔类型,表示是否删除文档
new 布尔类型,表示返回更新前的文档还是更新后的文档
fields 文档中需要返回的字段(可选)
upsert 布尔类型,值为true时表示这是一个upsert,默认值是false

写入安全机制

写入安全(Write Concern)是一种客户端设置,用于控制写入的安全级别。默认情况下,插入,删除和更新都会是一直等待数据库的响应,然后才会继续执行。通常遇到错误时,客户端会抛出一个异常。
两种最基本的写入安全机制是应答写入和非应答写入。应答写入是默认的方式:数据库会给出响应,告诉你写入操作是否成功执行。非应答式写入不返回任何响应。+

通常来说,应用程序应该使用应答式写入。但是,对于一些不是特别重要的数据(比如日志或者是批量加载数据),你可能不愿意为了自己不关心的数据而等待数据库的响应。这种情况下,可以使用非应答式写入。
尽管非应答式写入不返回数据库错误,但是这并不代表应用程序不需要作错误检查。如果尝试向已经关闭的套接字(socket)执行写入,或者写入套接字时发生了错误,都会引起异常。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容