MongoDB(五):MongoDB操作文档
本篇文章中将讲解如何使用MongoDB操作文档。
文档的数据结构和JSON基本一致,所有存储在集合中的数据都是BSON格式。BSON是一种类似json格式的一种二进制形式的存储格式,简称Binary JSON。
一、插入文档
MongoDB使用insert()或save()方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
例如:以下文档可以存储在MongoDB的test数据库的MongoDBTest集合中:
{"title" : "MongoDB", "description" : "mongoDB是一个NoSql数据库", "tags" : "NoSql" }
1、使用insert()方法插入文档

在上面的例子中,MongoDBTest是我们的集合名,如果该集合不在该数据库中,MongoDB会自动创建该集合并插入文档。doc是定义的变量,可以以变量的形式插入集合。
查看已经插入的文档:
> db.MongoDBTest.insert(doc)
WriteResult({ "nInserted" : 1 })
> db.MongoDBTest.find()
{ "_id" : ObjectId("5a6f13e72d0b37669c5d2a78"), "title" : "MongoDB", "description" : "mongoDB是一个NoSql数据库", "tags" : "NoSql" }
>
2、使用save()方法插入文档
插入文档也可以使用save()方法。如果不知道_id字段save()方法类似于insert()方法。如果指定_id字段,则会更新该_id的数据。
下面的例子表示使用save()命令更新数据:

二、查询文档
MongoDB查询文档使用find()方法。
find()方法以非结构化的方式来显示所有文档。
1、语法
MongoDB查询数据的语法格式如下:
db.collection.find(query,projection)
参数说明:
query:可选参数,使用查询操作符指定查询条件。
projection:可选参数,使用投影操作符指定返回的键。如果查询时要返回文档中所有键值,只需省略该参数即可(默认省略)。
如果你需要格式化读取的数据,可以使用pretty()方法,语法格式如下:
db.collection.find().pretty()
pretty()方法以格式化的方式来显示所有文档。
2、实例
例如:查询Student集合中的所有文档。

除了find()方法之外,还有一个findOne()方法,它只返回一个文档。

MongoDB与RDBMS where语句比较
如果你熟悉常规的SQL数据,通过下表可以更好的理解MongoDB的条件语句查询:
| 操作 | 格式 | 范例 | RDBMS中的类似语句 |
| 等于 | {<key>:<value>} | db.Student.find({"name":"张三"}).pretty() | where name='张三' |
| 小于 | {<key>:{$lt:<value>}} | db.Student.find({"score":{$lt:"80"}}).pretty() | where score<80 |
| 小于或等于 | {<key>:{$lte:<value>}} | db.Student.find({"score":{$lte:"80"}}).pretty() | where score<=80 |
| 大于 | {<key>:{$gt:<value>}} | db.Student.find({"score":{$gt:"80"}}).pretty() | where score>80 |
| 大于或等于 | {<key>:{$gte:<value>}} | db.Student.find({"score":{$gte:"80"}}).pretty() | where score>=80 |
| 不等于 | {<key>:{$ne:<value>}} | db.Student.find({"score":{$ne:"80"}}).pretty() | where score!=80 |
(1)查询name是张三的学生
db.Student.find({"name":"张三"}).pretty()
查询结果如下图所示:

(2)查询成绩小于80的学生
db.Student.find({"score":{$lt:"80"}}).pretty()
查询结果如下图所示:

(3)查询成绩小于等于80的学生
db.Student.find({"score":{$lte:"80"}}).pretty()
查询结果如下图所示:

(4)查询成绩大于80分的学生
db.Student.find({"score":{$gt:"80"}}).pretty()

(5)查询成绩大于等于80分的学生
db.Student.find({"score":{$gte:"80"}}).pretty()
查询结果如下图所示:

(6)查询成绩不等于80分的学生
db.Student.find({"score":{$ne:"80"}}).pretty()
查询结果如下图所示:

3、MongoDB AND条件查询
MongoDB的find()方法可以传入多个键(key),每个键(key)以逗号分隔开,等价于常规SQL的AND条件。
语法格式如下:
db.collection.find({key1:value1,key2:value2}).pretty()
例如:查询姓名为张三并且课程是C#程序设计的学生信息。
db.Student.find({"name":"张三","subject":"C#程序设计"}).pretty()
查询结果如下图所示:

以上实例中类似于RDBMS中的where语句:WHERE name='张三' AND subject='C#程序设计'。
4、MongoDB OR 条件查询
MongoDB的OR条件语句使用了关键字$or,语法格式如下:
>db.collection.find(
{
$or:[
{key1:value1},{key2:value2}
]
}
)
例如:查询姓名是李四或者成绩等于80的学生
db.Student.find({$or:[{"name":"李四"},{"score":"80"}]}).pretty()
查询结果如下图所示:

三、更新文档
MongoDB使用update()和save()方法来更新集合中的文档。接下来让我们详细来看下两个方法的应用及其区别。
1、update()方法
update()方法用于更新已经存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
参数说明:
query:update的查询条件,类似sql update查询内where后面的条件。
update:update的对象和一些更新的操作符(如$set,Sinc......)等,也可以理解为sql update查询内set后面的。
upsert:可选参数,这个参数的意思是:如果不存在update的记录,是否插入新的文档。如果为true则插入,默认是false不插入。
multi:可选参数,MongoDB默认是false,只更新找到的第一条记录。如果这个参数为true,就把按条件查询出来的多条记录全部更新。
writeConcern:可选参数,抛出异常的级别。
writeConcern的几种抛出异常的级别参数
writeConcern.NONE:没有异常抛出。
writeConcern.NORMAL:仅抛出网络错误异常,没有服务器错误异常抛出。
writeConcern.SAFE:抛出网络错误异常、服务器错误异常;并等待服务器完成写操作。
writeConcern.MAJORITY:抛出网络错误异常、服务器错误异常;并等待一个主服务器完成写操作。
writeConcern.FSYNC_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器将数据刷新到磁盘。
writeConcern.JOURNAL_SAFE:抛出网络错误异常、服务器错误异常;写操作等待服务器提交到磁盘的日志文件。
writeConcern.REPLICAS_SAFE:抛出网络错误异常、服务器错误异常;等待至少2台服务器完成写操作。
例如:使用update()方法更新标题(title)

上面的语句只会更新第一条查询到的文档,如果你要更新多条相同的文档,则需要设置multi参数为true。
如果要更新的数据不存在,upsert参数设置为true则会插入数据。

2、save()方法
save()方法通过传入的文档来替换已有文档,语法格式如下:
db.collection.save(
<document>,
{
writeConcern:<document>
}
)
参数说明:
document:要更新的文档数据。
writeConcern:可选参数,抛出异常的级别。
例如:更新_id=5a702a7f2c6ed8f4d3491831的文档。

四、删除文档
MongoDB使用remove()方法来移除集合中的数据。
注意:在执行remove()方法前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
remove()方法的基本语法格式如下:
db.collection.remove(
<query>,
<justOne>
)
如果MongoDB是2.6版本以后的,语法格式如下:
db.collection.remove(
<query>,
{
justOne:<boolean>,
writeConcern:<document>
}
)
参数说明:
query:可选参数,删除文档的条件。
justOne:可选参数,如果设为true或1,则只删除一个文档。
writeConcern:可选参数,抛出异常的级别。
实例
1、删除title为MongoDB教程的文档,只删除一个:

2、删除所有数据
如果想删除所有数据,可以使用下面的例子

MongoDB(五):MongoDB操作文档的更多相关文章
- Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)
Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简单介绍 Spring ...
- MongoDB第四天(操作文档,添加,更新,查询以及对于日期的相关操作)
添加文档: 添加单个文档,多个文档 package com.bjsxt.mongodbdemo; import com.mongodb.client.MongoCollection; import o ...
- MongoDB(五):更新文档、删除文档
1. 更新文档 MongoDB的uptade()和save()方法用于将集合中的文档更新.update()方法更新现有文档中的值,而save()方法是传递文档数据替换现有文档.从3.2版本开始,Mon ...
- MongoDB (五) MongoDB 数据库操作
一.MongoDB创建数据库: use 命令 MongoDB use DATABASE_NAME 用于创建数据库.该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库. 语法: use D ...
- ElasticSearch 基础入门 and 操作索引 and 操作文档
基本概念 索引: 类似于MySQL的表.索引的结构为全文搜索作准备,不存储原始的数据. 索引可以做分布式.每一个索引有一个或者多个分片 shard.每一个分片可以有多个副本 replica. 文档: ...
- pageoffice razor pageofficelink方式调用js实现操作文档
用官方的开发者帮助文档即可,在后台实例化时一定要将pageofficecontrol控件的id属性定义,然后在前台通过定义的id属性来调用相应的方法
- SEO配置信息操作文档
一.title(网站标题) title,就是浏览器上显示的那些内容,不仅用户能看到,也能被搜索引擎检索到(搜索引擎在抓取网页时,最先读取的就是网页标题,所以title是否正确设置极其重要.)title ...
- 从域名到网站,快速创建全新社区站点 - phpwind一键部署操作文档
关于phpwind一键部署服务,请查阅PW官网:http://www.phpwind.com/setup.html 选择一键部署镜像版本,立即开始使用: PW建站系统(Centos 64位) ———— ...
- IDEA使用操作文档
IDEA中怎么设置黑色或白色背景? http://jingyan.baidu.com/article/4e5b3e19330df191911e246b.html 一. IntelliJ IDEA 的 ...
随机推荐
- Microsoft Office2003打开office2007文件的补丁
Microsoft office2003打开office2007,不需要安装2007,只需要装一个补丁即可 搜索:office2003打开office2007文件的补丁
- 【js】with 语句
with 语句 为语句设定默认对象. with (object) statements 参数 object 新的默认对象. statements 一个或多个语句,object 是该语句的默认对象. ...
- 自己定义View学习之12/7(进度条之混合模式)
今天重点内容是我们学习自己定义view里面的混合模式.事实上我们的画布就跟photoshop一样.是个图层关系,一层盖着一层.这样就导致有非常多种覆盖模式,这就是我们今天的主题."混合模式& ...
- ps抠图简单方法
选中对象后保存对象到新的图层方法.ctrl+c,ctrl+v即可 1 使用魔术棒 适用范围:图像和背景色色差明显,背景色单一,图像边界清晰. 方法意图:通过删除背景色来获取图像. 方法缺陷:对散乱的毛 ...
- Spring Cloud 通过代码自定义配置Ribbon
我们还是先从官网文档开始学习,如下图所示,我们可以搞一个测试配置类,来验证是否真的可以通过代码来自定义配置Ribbon,但文档明确给出了警告:即这个测试配置类不能放在@ComponentScan所扫描 ...
- [svc]linux bridge&docker0&k8s pod网络模型通俗演义
linux namespace&bridge通俗演义 linux接口类型 br0 eth0: 一个接口 veth : 一对接口,类似一跟网线,一头有地址,另一头连到别处, linux 2个na ...
- C++windows内核编程笔记day13 进程、线程与信号量
Windows进程 进程是一个容器,包括程序运行须要的代码.数据.资源等信息, windows进程的特点: 每一个进程都有自己的ID号 每一个进程都有自己的地址空间.进程之间无法訪问对方的地址空间. ...
- git 从远程git服务上拉代码 git服务器非默认端口
从服务器上拉代码有如下报错: fatal: Not a git repository (or any of the parent directories): .git 初始代本地版本库: [root@ ...
- 常用的Eclipse设置
每次新建work space的时候,我都要修改一些默认设置,每次都要花一些时间找在哪里设置,总结如下. 启动加速 1. 去掉XML Validataion Windows --> Prefere ...
- In search of the perfect URL validation regex
To clarify, I’m looking for a decent regular expression to validate URLs that were entered as user i ...