persons文档的数据如下:

> db.persons.find()
{ "_id" : 2, "name" : 2 }
{ "_id" : 3, "name" : 3 }

> db.persons.update({_id:4},{_id:4,name:4})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.persons.find()
{ "_id" : 2, "name" : 2 }
{ "_id" : 3, "name" : 3 }

做完update操作,依然看不到_id:4的记录,因为update方法需要一个true指示器,才会对查询不到的记录进行insert操作:

> db.persons.update({_id:4},{_id:4,name:4},true)
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 4 })
> db.persons.find()
{ "_id" : 2, "name" : 2 }
{ "_id" : 3, "name" : 3 }
{ "_id" : 4, "name" : 4 }

现有需求,将persons文档中的name为"3"的改成"33"

> db.persons.update({name:"3"},{$set:{name:"33"}},false,true)

false含义:若查不到name:"33"的键值对,则不执行插入操作,true含义:表示是批量更新

为persons增加age:"88"属性

> db.persons.update({name:"4"},{$set:{age:"88"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4", "age" : "88" }

将age加2

> db.persons.update({name:"4"},{$inc:{age:2}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4", "age" : 90 }

将age属性拿走:

> db.persons.update({age:90},{$unset:{age:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }

给persons文档增加一条记录,_id为5

> db.persons.insert({_id:5,name:5,books:[]})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "name" : 5, "books" : [ ] }

给books数组增加一个元素:"js"和"extjs4.0"

> db.persons.update({_id:5},{$push:{books:"js"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "name" : 5, "books" : [ "js" ] }

> db.persons.update({_id:5},{$push:{books:"extjs4.0"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "name" : 5, "books" : [ "js", "extjs4.0" ] }

创建一个新的classes数组:

> db.persons.update({_id:5},{$push:{classes:"01class"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "name" : 5, "books" : [ "js", "extjs4.0" ], "classes" : [ "01class"
] }

为calsses数组一次增加几个元素:

> db.persons.update({_id:5},{$pushAll:{classes:["02class","03class","04class"]}}
)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "name" : 5, "books" : [ "js", "extjs4.0" ], "classes" : [ "01class"
, "02class", "03class", "04class" ] }

删除_id是5的记录,并创建一个新的_id是5的记录,使用$addToSet,此命令会检查要添加的元素在数组里面是不是存在,存在就不会再添加,否则会添加:

> db.persons.remove({_id:5})
WriteResult({ "nRemoved" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
> db.persons.insert({_id:5,books:["js"]})
WriteResult({ "nInserted" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "js" ] }
> db.persons.update({_id:5},{$addToSet:{books:"js"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "js" ] }
> db.persons.update({_id:5},{$addToSet:{books:"java"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "js", "java" ] }
> db.persons.update({_id:5},{$addToSet:{books:"mongo"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "js", "java", "mongo" ] }

删除books数组的第一个元素:"js",使用$pop命令:

> db.persons.update({_id:5},{$pop:{books:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "java", "mongo" ] }
> db.persons.update({_id:5},{$pop:{books:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "java" ] }

-1代表第一个元素,1代表最后一个元素

也可以使用pull命令一次删除一个指定的元素:

> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "java", "mongo", "js" ] }
> db.persons.update({_id:5},{$pull:{books:"js"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ "java", "mongo" ] }

$pullAll命令可以一次指定多个要删除的元素:

> db.persons.update({_id:5},{$pullAll:{books:["java","mongo"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ ] }

创建一条新的记录_id为6:

> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ ] }
{ "_id" : 6, "books" : [ { "type" : "js", "name" : "extjs4.0" }, { "type" : "db"
, "name" : "mongodb" }, { "type" : "js", "name" : "jquery" } ] }

为type是js的books元素添加pens:"too long"属性,使用.符号一定使用双引号引用

> db.persons.update({"books.type":"js"},{$set:{"books.$.author":"tom"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4, "name" : "4" }
{ "_id" : 5, "books" : [ ] }
{ "_id" : 6, "books" : [ { "type" : "js", "name" : "extjs4.0", "author" : "tom"
}, { "type" : "db", "name" : "mongodb" }]
}

db.persons.update({"books.type":"js"},{$set:{"books.$.pens":"too long"}})

判断数组元素执行插入操作,重复的元素不会被插入第二次:

> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4 }
{ "_id" : 5, "books" : [ "js" ] }

> db.persons.update({_id:5},{$addToSet:{books:{$each:["js","db","java"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.persons.find()
{ "_id" : 2, "name" : "33" }
{ "_id" : 3, "name" : "33" }
{ "_id" : 4 }
{ "_id" : 5, "books" : [ "js", "db", "java" ] }

mongodb批量更新操作文档的数组键的更多相关文章

  1. MongoDB创建\更新\删除文档操作

     一.插入\创建文档 --当插入一个不存在的文档时,会自己主动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecti ...

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

    插入并保存文档操作 用insert向目标集合插入文档,如果没有_id键则会自动添加.最后自动保存. >db.foo.insert({"bar":"baz" ...

  3. MongoDB(7)- 文档插入操作

    插入方法 db.collection.insertOne() 插入单条文档到集合中 db.collection.insertMany() 插入多条文档到集合中 db.collection.insert ...

  4. MongoDB学习(查找文档和其他数据查找操作)

    理解Cursor对象和查询运算符 cursor对象 cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象. 在使用 find() 方法查询时,返回的并非实际文档,而是一 ...

  5. jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax

    jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...

  6. MongoDB,无模式文档型数据库简介

    MongoDB的名字源自一个形容词humongous(巨大无比的),在向上扩展和快速处理大数据量方面,它会损失一些精度,在旧金山举行的MondoDB大会上,Merriman说:“你不适宜用它来处理复杂 ...

  7. Spring Data MongoDB 四:基本文档改动(update)(一)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data  Mo ...

  8. MongoDB改动、删除文档的域属性实例

    MongoDB改动.删除文档的域属性实例 在站点的开发中,可能最初的设计不合理.或者后期业务的变更,会造成文档结构会有些无用的属性.须要去删除或改动.因为MongoDB 是无 Schema 的,不像关 ...

  9. 关于Elasticsearch文档的描述以及如何操作文档的详细总结

    文档 什么是文档 在大多数应用中,多数实体或对象可以被序列化为包含键值对的 JSON 对象. 一个 键 可以是一个字段或字段的名称,一个 值 可以是一个字符串,一个数字,一个布尔值, 另一个对象,一些 ...

随机推荐

  1. yii联查

    $count = Acticle::find()->select("acticle_type.act_type,acticle.act_id,acticle.act_title,act ...

  2. iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)

    原文:iis启动 服务无法在此时接受控制信息. (异常来自 HRESULT:0x80070425) 问题描述:每隔一段时间应用程序池就会自动停止,报错:服务无法在此时接受控制信息. (异常来自 HRE ...

  3. java学习笔记(8)——多线程

    进程:是一个程序在其自身的地址空间的一次执行活动. 线程:(区别于进程)线程没有独立的存储空间. 几个概念:时间片 线程  进程   能不能够用多进程代替多线程呢? 两个进程切换时要交换内存空间,而多 ...

  4. OpenGL(六) gluLookAt和gluPerspective函数解析

    在调用gluLookAt和gluPerspective函数之前一般要先调用一下glLoadIdentity函数,先说一下这个函数是做什么的. glLoadIdentity glLoadIdentity ...

  5. POJ1236-Network of Schools(Tarjan + 缩点)

    主题链接 题意:给定一张有向图,问最少选择几个点能遍历全图.以及最少加入几条边使得有向图成为一个强连通图. 思路:对于有向图而言,首先求出有几个强连通分量,之后将每一个强连通分量缩点,形成DAG.本题 ...

  6. Paxos—以选美比赛为例PPT

  7. C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)

    1. size_type find_first_of( const basic_string &str, size_type index = 0 ); 查找在字符串中第一个与str中的某个字符 ...

  8. TCP 三次握手(相当于寄信需要回执,第一次握手:我寄给你一封信。第二次握手:你回我一封信。第三次握手:我再给你一个回执,这样你才能确认我收到信了)

    TCP 连接是通过三次握手进行初始化的.三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.以下步骤概述了通常情况下客户端计算机联系服务器计算机的过程: 1. 客户端向服务器发送 ...

  9. WPF实用指南二:移除窗体的图标

    原文:WPF实用指南二:移除窗体的图标 WPF没有提供任何功能来移除窗体上的icon图标.一般的做法是设置一个空白的图标,如下图1: 这种做法在窗体边框与标题之间仍然会保留一片空白. 比较好的做法是使 ...

  10. Java之java.lang.IllegalMonitorStateException

    今天又中彩了, 原本很简单的多线程程序, 蓦然间冒了个"java.lang.IllegalMonitorStateException" , 杀了个措手不及. 一直纳闷, 为什么为什 ...