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. Android中SQLite数据库操作(2)——SQLiteOpenHelper类

    如果开发者对SQL语法不熟悉,我要告诉你一个好消息,Android提供了一个SQLiteOpenHelper类. 在实际项目中很少使用SQLiteDatabase的方法(请看:http://blog. ...

  2. Network Function Virtualization for a Network Device

    An apparatus for performing network function virtualization (NFV), comprising: a memory, a processor ...

  3. B 维背包+完全背包 Hdu2159

    <span style="color:#3333ff;">/* ---------------------------------------------------- ...

  4. 写一个去除AI2XAML注释及多余数字位数的WPF窗体程序

    原文:写一个去除AI2XAML注释及多余数字位数的WPF窗体程序 使用正则表达式去除多余注释及冗余数字位,关键代码:            string pattern = @"/b(/d+ ...

  5. C#中的String.Format介绍

    关键字:C# string.format作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/15/csharp-string_for ...

  6. WPF特效-实现弧形旋转轮播图

    原文:WPF特效-实现弧形旋转轮播图 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u013224722/article/details/77004 ...

  7. ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Identity 验证特性 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 验证特性 上一章节我们简单介绍了 ...

  8. linux_crontab_定时删除

    #每天2:30 删除4天前qac的原始log30 2 * * * find /home/iknow/ETL/RetlPull/retl-pull/data/qac -name qac.log.new. ...

  9. DELPHI下多线程编程的几个思维误区(QDAC)

    有几个网友私下问我一些有关线程的事情.过节写个东西上来大家交流. 思维误区1,自己新建的THREAD是线程,自己的主程序不是线程. 很多人在多线程编程没有把主线程也当作线程.其实主线程也是线程.看起来 ...

  10. php 将一个二维数组中两个相同的value 相同 指定值相加

    array(3) { [0]=> array(7) { ["mlid"]=> int(1) ["num"]=> int(1) ["c ...