概述

本章节介绍Insert、Update、Delete、Drop操作基本语法。

环境:

Version:3.4

insert

insert()基本语法如下:

db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)

1.单条插入

db.person.insert({"age":10})

2.多条插入

使用文档数组作为参数,不过注意批量插入也会存在长度的限制

db.person.insert([{"age":11},{"age":12}])

3.错误的语法:

db.person.insert({"age":11},{"age":12})

只有age:11被插入进去,由于接收的插入文档不是数组

容易误导的地方:

db.person.insert([{"age":11},{"age":12}])

db.person.insert({"name":11,"age":12})

db.person.insert({"age":11,"age":12})

第一个插入是插入两个文档,第二个插入是插入一个文档,第三个虽然也是一个文档但是由于键重复,所以只有后一个值会被插入age:12

delete

remove() 方法的基本语法格式如下所示:

db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern :(可选)抛出异常的级别。

1.删除num大于100的数据

db.new.remove({"num":{$gt:100}});

2.删除new集合所有数据

db.new.remove({});

注意:针对大表清空所有数据慎重使用remove({}),会非常的慢,而且对服务器的压力也非常的大,可以选择drop操作。

3.删除num等于100的数据

db.new.remove({"num":100})

4.测试删除速度

var timeRemoves = function(){

    var start =(new Date()).getTime();

    db.new.remove({'num':{$gt:100}});

    db.new.findOne();

    var timediff= (new Date()).getTime() - start;

    print("removeTimes: "+timediff+"ms")

}

timeRemoves()

update

update() 方法用于更新已存在的文档。语法格式如下:

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。

例:

db.person.insert([{"name":"chen","age":15},{"name":"li","age":20},{"name":"zhang","age":20}]);

$ set修改符

用于修改键的值,如果键不存在就增加键

//将age=10的数据改成15,默认如果age=10的有多条记录只更新第一条

db.person.update({"name":"li"},{$set:{"age":10}})

//更新多个满足条件的值,同时如果更新的值不存在就插入更新的值,注意:这里插入的值是20不是30

db.person.update({"age":30},{$set:{"age":20}},{multi:true,upsert:true})

可以省略multi,upsert,这里不能有花括号,但是不建议这样做

db.person.update({"age":30},{$set:{"age":20}},true,true)

//值更新为数组

db.person.update({"name":"zhang"},{$set:{"age":[10,12,14]}},{upsert:true})

//修改为其它的值

db.person.update({"name":"zhang"},{$set:{"age":''}},{upsert:true})

db.person.update({"name":"zhang"},{$set:{"age":null}},{upsert:true})

$inc修改符

用于增加已有键的值,如果键不存在就创建,只能用于整形、长整型、浮点型。

//将name=zhang的记录的age键+10

db.person.update({"name":"zhang"},{$inc:{"age":10}},{upsert:true})

//将name=zhang的记录的age键-10

db.person.update({"name":"zhang"},{$inc:{"age":-10}},{upsert:true})

$unset修改符

删除键类似关系数据库的删除字段操作,要区别$set修改符的将键设空或者null值

db.person.update({"name":"zhang"},{$unset:{"age":1}})

$push修改符

如果数组已经存在,“$push”会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。注意:必须是数组才能加入新的值

db.person.update({"name":"zhang"},{$push:{"comments":{"email":"abc@qq.com","address":"beijing"}}});

//再插入一条comments

db.person.update({"name":"zhang"},{$push:{"comments":{"mark":"aaa"}}});

$each修改符

向数组中添加元素

db.axc.remove({})

db.axc.insert({"title":1,"list":[1,2,3]})

db.axc.find();

//向list数组中添加单个元素

db.axc.update({"title":1},{$push:{"list":4}})

//向list数组中添加多个元素

db.axc.update({"title":1},{$push:{"list":{$each:[6,7]}}});

db.axc.find();

$addToSet修改符

往数组集中插入元素时,如果元素存在就不插入;方法和$push一样,唯一的区别就是$push不会判断重复值,重复也可以插入。$addToSet也可以结合$each一起使用方法和$push一样可以同时往数组中插入多个元素并且如果元素存在则不插入。

db.axc.update({"title":1},{$addToSet:{"list":2}})

db.axc.update({"title":1},{$addToSet:{"list":{$each:[2,3,4]}}});

$pull修改符

匹配数组中的元素将匹配上的元素全部删除,注意只能对数组中的元素进行匹配

db.lists.insert({"title":1,"list":[1,2,3]});

db.lists.find();

//清除list数组中的元素2

db.lists.update({},{$pull:{"list":2}})

db.lists.find();

$pop修改符

从数组的末端或头删除一个元素,$pop:{"list":1}:从末尾删除一个元素;$pop:{"list":-1}:从开头删除一个元素

//向数组list中插入两个元素

db.lists.update({},{$push:{"list":{$each:[2,4]}}});

db.lists.find()

//从末尾删除元素

db.lists.update({},{$pop:{"list":1}});

//从开头删除元素

db.lists.update({},{$pop:{"list":-1}});

基于位置的数组修改方法

可以有两种方式来定位数组中的元素:

1.通过下标;数组的下标都是从0开始。

2.通过$定位操作符,

db.comment.insert({"title":1,"comments":[{"comment":"a","author":"chen","age":10},{"comment":"b","author":"wang","age":30},{"comment":"c","author":"zhang","age":40}]});

//将数组中的第一个列表的age值改成20

//方法1:

db.comment.update({},{$set:{"comments.0.age":20}});

//方法2:

db.comment.update({"comments.author":"chen"},{$set:{"comments.$.age":20}});

drop

删除test集合,注意drop后面的括号里面不需要带花括号

db.test.drop()

总结

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

MongoDB入门系列(二):Insert、Update、Delete、Drop的更多相关文章

  1. [Hive - LanguageManual] DML: Load, Insert, Update, Delete

    LanguageManual DML Hive Data Manipulation Language Hive Data Manipulation Language Loading files int ...

  2. insert update delete 语法 以及用法

    insert update delete 被称为 数据定义语句语句 也就是数据的增加 修改 删除 其中不包括查询 譬如: create database -创建数据库 alter database - ...

  3. mysql数据恢复 insert\update\delete 工具MyFlash

    一.简介MyFlash是由美团点评公司技术工程部开发维护的一个回滚DML操作的工具.该工具通过解析v4版本的binlog,完成回滚操作.相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易. 该 ...

  4. LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

    我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作.这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作 插入( ...

  5. 关于MyBatis mapper的insert, update, delete返回值

    这里做了比较清晰的解释: http://mybatis.github.io/mybatis-3/java-api.html SqlSession As mentioned above, the Sql ...

  6. PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)

    原文: PHP5: mysqli 插入, 查询, 更新和删除  Insert Update Delete Using mysqli (CRUD) PHP 5 及以上版本建议使用以下方式连接 MySQL ...

  7. Maven入门系列(二)--设置中央仓库的方法

    原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布 ...

  8. mysql 事务是专门用来管理insert,update,delete语句的,和select语句一点不相干

    1.mysql 事务是专门用来管理insert,update,delete语句的,和select语句一点不相干 2.一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性).Con ...

  9. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  10. mybatis入门系列二之输入与输出参数

    mybatis入门系列二之详解输入与输出参数   基础知识   mybatis规定mapp.xml中每一个SQL语句形式上只能有一个@parameterType和一个@resultType 1. 返回 ...

随机推荐

  1. mybatis中sql语句的批量插入

    <!-- 收件箱插入收件信息 -->    <insert id="insertReceiveemail">           <!-- 生成一条U ...

  2. JVM菜鸟进阶高手之路十四:分析篇

    转载请注明原创出处,谢谢! 题目回顾 JVM菜鸟进阶高手之路十三,问题现象就是相同的代码,jvm参数不一样,表现的现象不一样. private static final int _1MB = 1024 ...

  3. sql 触发器,看完后对CHK有更深的理解

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. 什么是触发器? 触发器对表进行插入.更新.删除 ...

  4. lua API 小记2

    1. 创建lua虚拟机 lua_State *lua_newstate (lua_Alloc f, void *ud) 创建一个新的独立的lua虚拟机. 参数指定了内存分配策略及其参数, 注意, 让用 ...

  5. python并发编程之多线程二

    一,开启线程的两种方式 方法一: from threading import Thread import random,time def eat(name): print('%s is eating. ...

  6. 转:JAVA里面的int类型 和Integer类型,有什么不一样

    JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...

  7. 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了

    在前面已经初步封装了一个MVP的网络请求框架,那只是个雏形,还有很多功能不完善,现在进一步进行封装.添加了网络请求时的等待框,retrofit中添加了日志打印拦截器,添加了token拦截器,并且对Da ...

  8. jquery 循环数组输出显示在html页面

    jquery 没有双向数据绑定,但是很多需求确实需要我们从后台接收到数组或者对象循环显示在前台页面上,这时我们可以用字符串拼接,元素添加的方法去实现 js部分如下: $(function(){ var ...

  9. 移动GIS未来的前景GIS解决方案应用

    目前,在我国一些发达地区,移动GIS所需的两个技术前提——移动互联网的普及和智能终端的普及都已经得到了满足,特别是平板电脑.智能手机的流行,苹果产品的风靡,为移动GIS的应用提供了肥沃的土壤,而GIS ...

  10. 深入解析Java垃圾回收机制

    引入垃圾回收 哪些内存需要回收? 引用计数法 可达性分析 如何回收 Marking 标记 Normal Deletion 清除 Deletion with Compacting 压缩 为什么需要分代收 ...