插入:

使用insert或save方法想目标集合插入一个文档:

db.person.insert({"name":"ryan","age":30});

使用batchInsert方法实现批量插入,它与insert方法非常类似,只是它接受的是一个文档数组作为参数。一次发送数十,数百乃至数千个文档会明显提高插入的速度。

db.person.batchInsert([{"name":"ryan","age":30},{"name":"pitaya","age":2}]);

如果在批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入到集合中,而这个文档以及之后的所有文档全部插入失败。如果希望batchInsert忽略错误并且继续执行后续插入,可以使用continueOnError选项。shell并不支持这个选项,但所有的驱动程序都支持。

更新:

使用update方法来更新集合中的数据。update有四个参数,前两个参数是必须的。

db.person.update({"name":"ryan"},{"$set":{"age":35}},true,true);

第一个参数:查询文档,用于定位需要更新的目标文档。

第二个参数:修改器文档,用于说明要对找到的文档进行哪些修改。

第三个参数:true表示要使用upsert,即如果没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。

第四个参数:true表示符合条件的所有文档,都要执行更新。

修改器:

$set:用来指定一个字段的值。如果这个字段不存在,则创建它。对于更新而言,对符合更新条件的文档,修改执行的字段,不需要全部覆盖。

db.person.update({"name":"ryan"},{"$set":{"age":35}},true,true);

$inc:用来增加已有键的值,或者该键不存在就创建一个。对于投票等有变化数值的场景,这个会非常方便。

db.person.update({"name":"ryan"},{"$inc":{"age":2}},true,true);//对符合name等于ryan的文档,age字段加2。

$push:向已有数组末尾加入一个元素。

db.person.update({"name":"ryan"},{"$set":{"language":["chinese"]}},true,true);//对符合name等于ryan的文档,添加一个language的数组

db.person.update({"name":"ryan"},{"$push":{"language":"english"}},true,true);//给数组的末尾添加一个值。

$addToSet:避免向数组插入重复的值。

db.person.update({"name":"ryan"},{"$addToSet":{"language":"english"}},true,true);

$each:与$push和$addToSet结合,一次给数组添加多个值。

db.person.update({"name":"ryan"},{"$push":{"language":{"$each":["Japanese","Portuguese"]}}},true,true);

db.person.update({"name":"ryan"},{"$addToSet":{"language":{"$each":["Japanese","Portuguese"]}}},true,true);

$pop:可以从数组的任何一端删除元素。

db.person.update({"name":"ryan"},{"$pop":{"language":1}},true,true);//从数组的末尾删除一个元素

db.person.update({"name":"ryan"},{"$pop":{"language":-1}},true,true);//从数组的头部删除一个元素

$pull:删除数组对应的值。全部删除。

db.person.update({"name":"ryan"},{"$pull":{"language":"english"}},true,true);

删除:

使用remove方法删除集合中的数据。它可以接受一个查询文档作为可选参数。给定这个参数以后,只有符合条件的文档才能被删除。(删除数据是永久性的,不能撤销,也不能恢复)。

db.person.remove({"name":"ryan"});//删除person集合中name字段的值等于ryan的所有文档。

db.person.remove();//删除person集合中所有的文档。

使用drop方法代替remove方法,可以大幅度提高删除数据的速度。但是这个方法不能指定任何限定条件。而且整个集合都会被删除,包括索引等信息,甚用!!

db.person.drop();

查询:

MongoDB中使用find方法来进行查询。查询就是返回一个集合中文档的子集,子集的范围从0个文档到整个集合。find方法接受两个参数。

第一个参数决定了要返回哪些文档,参数的内容是查询的条件。

第二个参数来指定想要的键(字段)。第二个参数存在的情况:键的值为1代表要显示,为0代表不显示。“_id”默认显示,其他默认不显示。第二个参数不存在的情况:所有字段默认显示。

db.person.find({"name":"ryan"},{"name":1});

查询条件:

$lt、$lte、$gt、$gte这四个,就是全部的比较操作符(没有$eq这个操作符),分别对应<、<=、>、>=。

db.person.find({"age":{"$lt":10}});

这里提供一段小脚本,插入10万条数据,做之后的测试用。

 for(var i=0;i<100000;i++){
db.person.insert({"name":"ryan"+i,"age":i});
}

$in、$nin,用来查询一个键的多个值。

db.person.find({"age":{"$in":[1,3]}});//查询age等于1或3的文档。

db.person.find({"age":{"$nin":[1,3]}});//查询age不等于1或3的文档。

$or,用来查询多个键的多个值。可以和$in等配合使用。

db.person.find({"$or":[{"name":"ryan2"},{"age":3}]});//查询name等于ryan2   或者   age等于3的文档。

$exists,查询的键对应是值是null的,默认会返回null和键不存在的文档。可以通过$exists来判断该键是否存在。

db.person.find({"age":{"$in":[null],"$exists":true}});//查询age等于null,并且键是存在的文档。

$where,用它可以在查询中执行任意的javascript,这样就能在查询中做(几乎)任何事情。为了安全起见,应该严格限制或者消除"$where"语句的使用。

db.person.find({"$where":function(){

...;//这里可以是任意的javascript语句。

}})

游标:利用游标可以限制结果的数量,略过部分结果,根据任意键按任意顺序的组合对结果进行各种排序,或者是执行其他的一些强大的操作。

 var cursor = db.person.find();
while(cursor.hasNext()){
obj = cursor.next();
...;//这里可以做任何事情。
}

常用的shell:

limit:只返回前面多少个结果。

db.person.find().limit(2);//查询符合条件的文档,显示前两个文档。

skip:跳过多少个结果后显示剩余的。

db.person.find().skip(2);//查询符合条件的文档,显示跳过2个文档后剩余的所有文档。

sort:用于排序。接受一个对象(一组键值对)作为参数,键对应文档的键名,值代表排序的方向。排序的方向可以是1(升序)或者-1(降序)。如果指定了多个键,则按照这些键被指定的顺序逐个排序。

db.person.find().sort({"name":1,"age":-1});//查询的结果,按照name升序,age降序来排序显示。

 

  喜欢请微信扫描下面二维码,关注我公众号--“精修Java”,做一些实战项目中的问题和解决方案分享。

玩转mongodb(四):细说插入、更新、删除和查询的更多相关文章

  1. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  2. oracle插入,更新,删除数据

    插入,更新,删除数据 oracle提供了功能丰富的数据库管理语句 包括有效的向数据库中插入数据的insert语句 更新数据的update语句 以及当数据不再使用时删除数据的delete语句 更改数据之 ...

  3. sqlserver 插入 更新 删除 语句中的 output子句

    官方文档镇楼: https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177564(v=sql.100) 从 ...

  4. 《mongoDB》基本操作-创建/更新/删除文档

    一:基本操作 - db; 当前选择的集合(等于数据库名) > db demo -  use db_name; 选择你要操作的集合 > use demo switched to db dem ...

  5. 2.MongoDB系列之创建更新删除文档

    1. 插入文档 // 单条插入 db.getCollection('blog').insertOne({'type': 'mongodb'}) // 批量 插入 db.getCollection('b ...

  6. MariaDB 插入&更新&删除数据(8)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  7. 数据库SQL语言学习--上机练习3(插入 更新 删除)

    上机练习3 . 将一个新学生记录(学号::姓名:陈冬:性别:男:所在系:信息系:年龄:20岁)插入到Student表中: ALTER TABLE Student ,); UPDATE Student ...

  8. DButils工具类能够用来获取数据库连接向数据库插入更新删除对象2

    package com.ctl.util; import java.awt.Color; import java.awt.Font; import java.awt.Insets; import ja ...

  9. trie树---(插入、删除、查询字符串)

    HDU   5687 Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:  1.insert : 往神奇字典中插入一个单词  2.delete: 在神奇字 ...

  10. SQL.Cookbook 读书笔记4 插入更新和删除

    第四章 插入更新和删除 4.1 插入数据 ,'PROGRA','NEW YOURK'); 4.2 从一个表向另一个表中复制 insert into dept_east(deptno,dname,loc ...

随机推荐

  1. [Ubuntu Version] 如何在terminal 查看当前 ubuntu的版本号

    命令: locate locate /etc/*release/etc/lsb-release/etc/os-release 命令: catcat /etc/os-releaseNAME=" ...

  2. 移动端与PC端的viewport

    第一种解析: 设备像素,就是我们直觉上觉得"靠谱"的像素,这些像素为所使用的各种设备提供了正规的分辨率,并且其值可以通过(通常情况下)从screen.width/height属性中 ...

  3. 解决由AJAX请求时forms认证实效的重新认证问题

    前言: 当用AJAX请求一个资源时,服务器检查到认证过期,会重新返回302,通过HTTP抓包,是看到请求了登录页面的,但是JS是不会进行跳转到登录页面. 使用环境: ASP.NET MVC 4 JQU ...

  4. 让Easy UI 的DataGrid直接内嵌的JSON对象,并重写form load 方法

    前言 我有这样的JSON对象 { "UserName": "jf", "UserPwd": "123456", &quo ...

  5. C++ - explicit和volatile/const的内容

    第一眼见到explicit和volatile可能会一愣一愣的觉得可能是c11或者c14新加的标识符. 其实不是这样,volatile和const两个关键字在C语言的第二个版本KR C的时候就被加入了C ...

  6. C#: 线程间操作无效: 从不是创建控件“dataGridView”的线程访问它

    最近在修改自动化小工具,用多线程来解决后台拷贝导致WinForm界面卡死的情况,但是遇到过错:线程间操作无效: 从不是创建控件“dataGridView”的线程访问它. 这是因为在多线程程序中,新创建 ...

  7. C# WPF 登录多线程中 “调用线程无法访问对象,因为另一个线程拥有该对象“

    造成这个错误的原因很多,以下是我遇到的 我的思路,开启一个线程A登录.因为服务器响应登录成功需要在主线程做一些操作,我这边需要用到主线程的窗口对象,我把窗口对象传到线程 A,直接用实例方法会有这个错误 ...

  8. SqlAlchemy操作(三)

    1.基于SQLALCHEMY建表 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Colu ...

  9. Sort-242. Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...

  10. Codeforces Round #427 (Div. 2) B. The number on the board

    引子: A题过于简单导致不敢提交,拖拖拉拉10多分钟还是决定交,太冲动交错了CE一发,我就知道又要错过一次涨分的机会.... B题还是过了,根据题意目测数组大小开1e5,居然蒙对,感觉用vector更 ...