`
bit1129
  • 浏览: 1067813 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【MongoDB学习笔记六】MongoDB修改器

 
阅读更多
本文首先介绍下MongoDB的基本的增删改查操作,然后,详细介绍MongoDB提供的修改器,以完成各种各样的文档更新操作

 MongoDB的主要操作

  • show dbs 显示当前用户能看到哪些数据库
  • use foobar 将数据库切换到foobar
  • show collections 显示当前数据库有哪些集合
  • db.people.update,update不带参数,可以用于察看源代码
  • help可以查找帮助
  • db.help()
  • db.people.help();

测试数据:

var p1 = {
"name":"Jack",
"age":34,
"nickname":"xiaoqiang",
friends:[
  {"name":"Cloe","age":"28"},	
  {"name":"Audrey","age":"31"},
]
}


var p2 = {
"name":"Cloe",
"age":28,
friends:[
  {"name":"Jack","age":"34"},	
  {"name":"Mike","age":"31"},
]
}

var p3 = {
"name":"Audrey",
"age":31,
friends:[
  {"name":"Jack","age":"34"},	
  {"name":"Hammer","age":"61","relation":"parent"},
]
}

 

MongoDB基本的增删改查操作

 

创建文档

1. 插入时MongoDB会检查文档是否包含_id,如果文档没有指定_id,MongoDB会为其创建;
2. 如果要插入的文档是多个,推荐使用批量插入。这样,可以减少连接MongoDB服务器的次数

3. MongoDB在插入文档时MongoDB仅检查传入数据是否包含_id以及数据大小是否超过16MB(v1.8-为4M),除此之外不再做任何验证,相对于SQL数据库的完整性校验操作,性能提高很多

 

依次插入:

use foobar
db.people.insert(p1);
db.people.insert(p2)
db.people.insert(p3);
db.people.find()  //查询所有数据

db.people.findOne(); //返回第一条数据,即find()操作的第一条数据

 

批量插入:

use foobar
db.people.remove();
var p = [p1, p2, p3];
db.people.insert(p); //MongoDB会将数组解释为文档集合,而不是插入集合本身
db.people.find();

 

 

更新文档

1.所谓的文档更新,实际效果是替换操作

2.默认情况下update只会更新第一个匹配到的文档,开启multi模式,才会更新所有匹配到的文档。在新版本的MongoDB中,multi update only works with $ operators

use foobar
db.people.update({"name":"Jack"},{"age":40});//不出意外的发现,name为Jack的文档完全被替换了成{"age":40}而不是期望的把Jack的age属性改为40
db.people.update({"age":40},p1); //还原为原来的文档

p1.age = 40;
db.people.update({"name":"Jack"},p1);//能够实现把name为Jack的文档的age改为40,其它保持不变,本质上还是替换操作,替换的是文档的内容,但是文档的主键保持不变

 

 删除文档

 

如果要删除的文档中包含的文档非常多,使用db.people.drop()删除people这个文档,还要执行db.people.ensureIndex()

 

db.people.remove({"age":40}); //删除age为40的文档,首先做了一个查找age为40的查询
db.people.remove({ "_id" : ObjectId("54431f77f663556fc09af351")});//把主键作为删除的查询条件
db.people.remove();//不带任何参数,清空people集合中的所有文档

 

 

 创建或者更新文档

1. 使用update操作,如果文档不存在,update结果无影响

2. 使用upsert操作(update方法的第三个参数为true),那么如果找不到要更新的文档,则做insert操作

 

 

use foobar
p1.age = 40;
db.people.update({"name":"JackNOtExit"},p1);//操作无影响
db.people.find();
db.people.update({"name":"JackNOtExit"},p1,true);//添加true作为第三个参数,操作的结果是新增一个新的文档

 

  MongoDB修改器

  • $inc 对指定的键做加法操作,如果指定的关键不存在,则新创建这个键,并且赋值为$inc指定的值。
  • $set 为指定的键赋值,如果指定的键不存在,则自动创建。设值的情况比较复杂,比如为内嵌文档的某个Key设值,复杂点在于需要指定MongoDB能够解析到指定Key的表达式
  • $unset $set的反操作,即它用来清除一个Key及其值
  • $push 对数组进行操作(在MongoDB中,只有Javascript数组一种集合类型,其它语言如Java的各种集合类型都会保存为Javascript的数组),$push将一个元素追加到集合的末尾(不管这个元素是否存在于数组中),如果数组不存在,则首先创建数组
  • $pushAll $push操作的批量版本,如果给$push操作提供一个数组作为参数,那么$push认为是把整个数组作为一个元素加入到指定的数组末尾
  • $addToSet $pushAll的去重版本,即$addToSet实现了Java的Set集合的特性(Set中不能包含相同的元素)
  • $pop 从数组中移除一个元素{$pop:{"key":1}}从数组末尾删除;pop:{"key":-1}}从数组开头删除;
  • $pull 从数组中移除指定的元素
  • $pullAll $pull的批量版本
  • $rename 修改指定键的键名

$inc

 1. MongoDB把inc作为变量使用,因此不能使用引号把$inc括起来

 2. MongodDB的$inc操作,是getAndInc操作,因此,它不会与其它的$inc操作产生冲突

 

 db.people.update({"name":"Jack"},{$inc:{"age":3}}); //为Jack的age属性加3,此时的update操作即针对键进行更新操作,而不是普通Update操作那样是个替换操作
 

 

$set

 

db.people.update({"name":"Jack"},{$set:{"age":34,"worklocation":"ctu"}});//Jack的age改为34,同时添加了一个新的键worklocation

//$set作用于数组,相当于替换。使用$push/$pop操作数组元素
db.people.update({"name":"Jack"},{$set:{"friends":[{"Tony":"33"}]}});  

//$set为Jack添加一个对象obj
db.people.update({"name":"Jack"}, {$set:{"obj":{"value":1}}}); 
db.people.update({"name":"Jack"}, {$set:{"obj.value":2}}); //将Jack的obj对象的value值改为2,使用Javascript的点语法 

 

$set定位修改$符

db.people.update({"name":"Jack"}, {$set:{"friends.1.age":35}}); //把Jack的friends数组的第二个元素(下标为1)的age改为35

db.people.update({"name":"Jack"}, {$set:{"friends.1.age":35}}); //把Jack的friends数组的第二个元素(下标为1)的age改为35
//把朋友中包含名字为Andrey的元素对应的age改为77,$在这里充当选出来的元素在数组中的下标
//friends.name的含义不是friends有个name键,而是指的是friends数组中的每个元素的name属性 
db.people.update({"friends.name":"Audrey"}, {$set:{"friends.$.age":77}}); 


 

 

$unset

 

db.people.update({"name":"Jack"},{$unset:{"worklocation":"ctu"}});//把刚给Jack新加的键worklocation删除

 

 $push

var item = {"name":"Tony","age":"33"};
db.people.update({"name":"Jack"},{$push:{"friends": item}}); //为Jack的friends添加一个元素item,item作为内嵌的文档,没有_id属性


var items = {item, item};
db.people.update({"name":"Jack"},{$push:{"friends": items}}); //为Jack的friends添加一个元素items,items作为friends的一个数组类型的元素

  

 

$pushAll

 

var items = {item, item};
db.people.update({"name":"Jack"},{$pushAll:{"friends": items}}); //为Jack的friends添加两个元素,分别是items数组中的元素

 

 

$addToSet

 

 

var items = {item, item};
db.people.update({"name":"Jack"},{$set:{"friends":[]}});//清空Jack的friends数组
db.people.update({"name":"Jack"},{$addToSet:{"friends": items}}); //通过addToSet为Jack的friends添加元素,奇怪的是没达到去重效果,即friends中包含两个一样的item

 

   应该使用$each操作符

    

var items = {item, item};
db.people.update({"name":"Jack"},{$set:{"friends":[]}});//清空Jack的friends数组
db.people.update({"name":"Jack"}, {$addToSet:{"friends":{$each:items}}});
 

 

 

$pop

 

db.people.update({"name":"Jack"},{$pop:{"friends":-1}}); //friends指定了要删除元素的键;-1表示删除数组的头元素
  

 

$pull

 

db.people.update({"name":"Jack"},{$pull:{"friends":{"name":"Cloe"}}});; //从Jack的friends数组删除满足条件的元素,name是friends元素的一个属性,而不是friends本身的属性

 

MongoDB查询

更新操作包含了查询的语义,update操作的第一个参数就是指定查询条件,在这篇文章中,都是使用{"name":"Jack"}作为查询条件,实际上的查询条件要比这个复杂的多,下一篇博客将详细介绍MongoDB的查询,它类似于$修改器,MongoDB提供了很多用于设置查询条件的$比较器,$逻辑器等。

 

分享到:
评论

相关推荐

    mongodb学习笔记

    mongodb学习笔记 MongoDB 是一个基于分布式文件存储的开源数据库系统,主要用于处理大量数据的存储和查询。以下是 MongoDB 的一些基本操作和技巧: 插入文档 MongoDB 中可以使用 `insert` 方法来插入文档,例如 ...

    Studio 3T(MongoDB数据库GUI连接工具) 学习笔记

    这篇学习笔记将深入探讨如何使用Studio 3T与MongoDB进行交互。 首先,安装并启动Studio 3T。下载适合你操作系统的版本(Windows、macOS或Linux),按照安装向导完成安装。启动后,你会看到一个简洁的界面,准备连接...

    MongoDB 学习笔记

    MongoDB提供了多种修改器操作符来实现更新,包括$inc、$set等。$inc用于增加字段的数值,其使用方式如db.person.update({"age":23},{$inc:{"salary":1000}}),这会将年龄为23的文档中薪水字段增加1000。$set用于设置...

    《MongoDB权威指南》读书笔记1

    15. **修改器**:`$set`用于设置或创建键的值,`$unset`用于删除键,`$inc`用于增加或减少键的值,`$push`在数组末尾添加元素,`$addToSet`确保数组中只包含唯一的元素,`$pull`按条件删除数组中的元素,`$pop`从...

    holemar学习笔记(2011-12-21)

    这是本人多年积累的学习笔记,记录详细、内容宽广,对新手高手都会有所帮助 作者: 冯万里(Holemar) 邮箱: daillow@gmail.com QQ: 292598441 MSN: daillo@live.cn 更新日期: 2011-12-21 文档都可以用文本编辑器...

    MongoDB的安装方法图文教程

    为了进一步学习和理解MongoDB,建议查阅相关的入门教程和配置指南,如文中提到的“MongoDB的安装及配置文件选项全解”、“MongoDB快速入门笔记”等资源,这些都能帮助你更好地掌握MongoDB的使用技巧和最佳实践。

    网络爬虫基础 个人学习笔记

    这篇个人学习笔记主要涵盖了数据的采集、存储以及Scrapy爬虫框架三个核心部分。 **一、数据的采集** 1. **HTTP协议**:网络爬虫的基础是HTTP协议,理解请求和响应的工作原理至关重要。GET和POST是最常见的两种请求...

    StorageDB对HTML5存储进行封装提供类似MongoDBAPI

    10. **应用场景**: StorageDB适用于那些需要在客户端存储大量数据且不希望频繁与服务器交互的应用,例如离线阅读器、个人笔记应用、游戏存档等。 11. **学习资源**: 要深入了解和使用StorageDB,可以参考其官方文档...

    ios学习笔记二--电影网

    在本“ios学习笔记二--电影网”的教程中,我们将深入探讨如何使用Node.js和Express框架构建一个简单的在线电影数据库。Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得开发者能够在服务器端使用...

    MySQL入门很简单-学习笔记

    ### MySQL入门很简单—学习笔记知识点总结 #### 一、数据库概述 **1.1 数据存储方式** - **文件系统**:传统的数据存储方式,通过文件和文件夹组织数据。 - **数据库系统**:通过数据库管理系统(DBMS)进行数据...

    spring框架学习笔记

    Jdom提供了方便的API来创建、修改和读取XML文档,使得开发者能更轻松地处理与XML相关的任务。 3. **模拟Spring功能**: 在学习Spring时,通过模拟其核心功能,如依赖注入,可以帮助理解其工作原理。例如,可以手动...

    学习笔记::books:JAVA,Spring,SpringMVC,SpringBoot,Mybatis,Vue,MySQL,MongoDB,Radis,Docker,Nginx,......笔记

    这些学习笔记涵盖了IT领域的多个重要方面,包括编程语言、框架、数据库、缓存技术、容器化和Web服务器等。下面将分别对这些知识点进行详细解释。 1. **Java**: Java是一种广泛使用的面向对象的编程语言,以其跨平台...

    Note-App-with-MongoDB

    1. 用户界面:通常包括一个列表视图展示所有笔记,以及一个编辑视图用于创建和修改笔记。这些界面通过UI控制器如UIViewController或UITableViewController与后台数据模型进行通信。 2. 数据模型:在Swift中,可以...

    spring-data的学习笔记

    7. **创建事务管理器**:同样地,Spring Boot会自动配置事务管理器。 8. **编写实体类**:定义实体类,这些实体类将映射到数据库中的表。 9. **创建Repository接口**:使用Spring Data JPA提供的Repository接口来...

    Express+Mongoose课件、笔记、资料、代码及数据库.zip

    在本压缩包“Express+Mongoose课件、笔记、资料、代码及数据库.zip”中,主要涉及了两个关键的技术:Express.js和Mongoose,以及它们与MongoDB数据库的结合使用。MongoDB是一个流行的NoSQL数据库,它以JSON格式存储...

    springboot学习思维笔记.xmind

    springboot学习笔记 spring基础 Spring概述 Spring的简史 xml配置 注解配置 java配置 Spring概述 Spring的模块 核心容器CoreContainer Spring-Core Spring-Beans ...

    云笔记项目完整版源码

    【云笔记项目完整版源码】是一个面向开发者和学习者的实践项目,旨在提供一个完整的、功能完善的云笔记应用实现。这个项目可能包含了前端用户界面、后端服务、数据库设计以及必要的API接口,允许用户在多设备间同步...

    笔记.rar-自己的笔记,留一个备份

    【标题】: "笔记.rar" 是一个压缩文件,包含了作者个人整理的学习笔记,可能是为了创建一个备份以便随时查阅。从标签来看,这份笔记主要聚焦在前端开发和Node.js技术上。 【描述】: 描述简单明了,"笔记.rar-------...

    web_js_study:js学习笔记

    本"web_js_study:js学习笔记"涵盖了JS的全栈学习,旨在帮助开发者从基础到进阶全面掌握这一强大的脚本语言。 一、基础概念与语法 1. 变量:JavaScript中的变量使用var、let或const声明,其中let和const是ES6新增的...

    数据库复习笔记及mooc上的题库

    总的来说,这份“数据库复习笔记及Mooc上的题库”涵盖了数据库的基础理论、设计原则、操作技巧和优化策略,是你备考或深入学习数据库的理想资源。通过学习和练习,你可以提升在数据库领域的专业素养,更好地应对各种...

Global site tag (gtag.js) - Google Analytics