插入文档

文档的数据结构和 JSON 基本一样。

所有存储在集合中的数据都是 BSON 格式。BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

insert

db.collection.insert(): 向集合中插入文档,若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

语法格式如下:

​db.collection.insert(​​​​<document>,​​​​{​​​​writeConcern: <document>​​​​}​​​​​)​

例子: 

db.c1.inser({name:"jqk"})

db.c1.inser({_id:ObjectId("5e81b3ac4d4d000026004f6a"),name:"jqk"})   指定主键

db.c1.inser([{name:"张三"},{name:"李四"}])  插入多条数据

db.test_c2.insert([{name:"张三"},{name:"李四"}],{writeConcern:"majority",ordered:true})  指定其他参数


save

db.collection.save(): 向集合中插入文档,若插入的数据主键已经存在,则更新。

语法格式如下:

​db.collection.save(​​​​<document>,​​​​{​​​​writeConcern: <document>​​​​}​​​​​)​


insertOne

db.collection.insertOne(): 向集合中插入文档,若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。

语法格式如下:

​db.collection.insertOne(​​​​<document>,​​​​{​​​​writeConcern: <document>​​​​}​​​​​)​​​


insertMany

db.collection.insertMany(): 用于向集合插入一个多个文档。

语法格式如下:

​db.collection.insertMany(​​​​[ <document 1> , <document 2>, ... ],​​​​{​​​​writeConcern: <document>,​​​​ordered: <boolean>​​​​}​​​​)​



参数说明

参数

描述

document

文本内容

writeConcern

writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:

0:发起写操作,不关心是否成功;

1~集群最大数据节点数:写操作需要被复制到指定节点数才算成功;

majority:写操作需要被复制到大多数节点上才算成功。


insert: 若插入的数据主键已经存在,则会抛 DuplicateKeyException 异常,提示主键重复,不保存当前数据。


save: 如果 _id 主键存在则更新数据,如果不存在就插入数据。

ordered

指定是否按顺序写入,默认 true,按顺序写入。



更新文档

MongoDB通过update函数或者save函数来更新集合中的文档;

updateOne:更新单个文档。
updateMany:更新多个文档。
replaceOne:替换单个文档。
findAndModify兼容了查询和修改指定文档的功能,findAndModify只能更新单个文档
findOneAndUpdate:更新单个文档并返回更新前(或更新后)的文档。
findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档


update

db.collection.update(): 向集合中更新文档。

语法格式如下:

db.collection.update(query,update,options)

例子: 

db.test_c2.update({name:"张三"},{name:"李四"})
db.test_c2.update({type:"novel"},{publishedDate:new Date()},{"multi":true}) //更新多个文档 覆盖 必须使用操作符否则报错
db.test_c2.update({type:"novel"},{$set:{publishedDate:new Date()}},{"multi":true}) //更新多个文档,并且更新指定字段



更新操作符 

操作符

格式

描述

例子

$set

{$set:{field:value}}

指定一个键并更新值,若键不存在则创建

db.c1.update({name:“张三”},{$set:{name:“王五”}});

$unset

{$unset : {field : 1 }}

删除一个键


$inc

{$inc : {field : value } }

对数值类型进行增减

db.c1.update({name:“王五”},{$inc:{age:-5}});

$rename

{$rename : {old_field_name :

new_field_name } }

修改字段名称

db.c1.update({name:“王五”},{$rename:{name:“username”}});

$push

{ $push : {field : value } }

将数值追加到数组中,若数组不存在则会进行初始化

 db.c1.update({},{$push:{hobby:“写代码”}},{multi:true});

$pushAll

{$pushAll : {field : value_array }}

追加多个值到一个数组字段内

db.c1.update({name:“王五”},{$pullAll:{hobby:[“写代码”,“好好学习”]}});

$pull

{$pull : {field : _value } }

从数组中删除指定的元素

db.c1.update({name:“王五”},{$pull:{hobby:“好好学习”}});

$addToSet

{$addToSet : {field : value } }

添加元素到数组中,具有排重功能


$pop

{$pop : {field : 1 }}

删除数据元素。可取值只能是1或-1。1表示尾部删除,-1表示头部删除

 db.c1.update({name:“李四”},{$pop:{hobby:-1}})



参数说明

参数

描述

query

update的查询条件,类似sql update查询内where后面的。

update

update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的

upsert

可选,如果不存在update的记录,是否插入新的记录。默认false,不插入

multi

可选,是否按条件查询出的多条记录全部更新。 默认false,只更新找到的第一条记录  为true是update必须使用操作符  [Error] Invalid key 'name': update only works with $ operators

writeConcern

可选,决定一个写操作落到多少个节点上才算成功。



删除文档

MongoDB remove()函数是用来移除集合中的数据。

remove

db.collection.remove(): 移除集合中的数据。

语法格式如下:

​db.collection.remove(​​​​<document>,​​​​option​​​​​)​

db.collection.update(): 向集合中更新文档。

db.c1.remove({age:{$exists:false}},1);//删除age为空的第一条数据
db.c1.remove({age:{$exists:false}});//删除所有age为空的数据。
db.user.remove( { } ) // 删除所有记录
db.user.remove() //报错


deleteOne

db.collection.deleteOne(): 移除集合中的第一条数据。


deleteMany

db.collection.deleteMany(): 移除集合中的全部数据。


findOneAndDelete

db.collection.deleteMany():删除文档后并且返回信息


查询文档

find

​db.collection.find(​​​​query,​​​​projection​​​​​)​

query :可选,使用查询操作符指定查询条件
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。投影时,id为1的时候,其他字段必须是1;id是0的时候,其他字段可以是0;如果没有_id字段约
束,多个其他字段必须同为0或同为1。

例子:

db.books.find({tag:"nosql"}) //查询带有nosql标签的book文档:
db.books.find({_id:ObjectId("61caa09ee0782536660494d9")}) //按照id查询单个book文档:
db.books.find({type:"travel",favCount:{$gt:60}}) //查询分类为“travel”、收藏数超过60个的book文档:
db.books.find({name:“张三”},{sex:0,hobby:0}) //
db.test.find( {$or:[{name : "《MongoDB 入门教程》"},{price : 24}]}) //或者


查询条件对照表 

SQL

MQL


a = 1

{a: 1}


a <> 1

{a: {$ne: 1}}

不存在或存在但不等于

a > 1

{a: {$gt: 1}}

存在并大于

a >= 1

{a: {$gte: 1}}

存在并大于等于

a < 1

{a: {$lt: 1}}

存在并小于

a <= 1

{a: {$lte: 1}}

存在并小于等于

a in ('','')

{a: {$in: 1}}

存在并大于等于

a not in ("","")

{a: {$nin: 1}}

不存在或不在指定数组中

or

$or

匹配两个或多个条件中的一个

and

$and

匹配全部条件

like

$regex

正则表达式


分页

skip()用于指定跳过记录数,limit() 则用于限定返回结果数量。可以在执行find命令的同时指定skip、limit

例子:

skip(8).limit(4)参数,以此实现分页的功能。比如,假定每页大小为8条,查询第3页的book文档


排序

sort() 方法对数据进行排序

例子:

#指定按收藏数(favCount)降序返回
db.books.find({type:"travel"}).sort({favCount:-1})




 pretty() 









游标

游标是指对数据一行一行地进行操作,在 MongoDB 数据库中对游标的控制非常简单,只需使用 firid() 函数就可以返回游标。有关游标的方法参见下表。


MongoDB 游标的使用

方法名

作用

hasNext

判断是否有更多的文档

next

用来获取下一条文档

toArray

将查询结构放到数组中

count

查询的结果为文档的总数量

limit

限制查询结果返回数量

skip

跳过指定数目的文档

sort

对查询结果进行排序

objsLeftlnBatch

查看当前批次剩余的未被迭代的文档数量

addOption

为游标设置辅助选项,修改游标的默认行为

hint

为查询强制使用指定索引

explain

用于获取查询执行过程报告

snapshot

对查询结果使用快照

使用游标时,需要注意下面 4 个问题。


1) 当调用 find() 函数时,Shell 并不立即查询数据库,而是等真正开始获取结果时才发送查询请求。


2) 游标对象的每个方法几乎都会返回游标对象本身,这样可以方便进行链式函数的调用。


3) 在 MongoDB Shell 中使用游标输出文档包含两种情况,如果不将 find() 函数返回的游标赋值给一个局部变量进行保存,在默认情况下游标会自动迭代 20 次。如果将 find() 函数返回的游标赋值给一个局部变量,则可以使用游标对象提供的函数进行手动迭代。


4) 使用清空后的游标,进行迭代输出时,显示的内容为空。


游标从创建到被销毁的整个过程存在的时间,被称为游标的生命周期,包括游标的创建、使用及销毁三个阶段。当客户端使用 find() 函数向服务器端发起一次查询请求时,会在服务器端创建一个游标,然后就可以使用游标函数来操作查询结果。


以下三种情况会让游标被销毁。

  • 客户端保存的游标变量不在作用域内。
  • 游标遍历完成后,或者客户端主动发送终止消息。
  • 在服务器端 10 分钟内未对游标进行操作。


以下语句显示使用游标查找所有文档:

>var cursor = db.test.find()
>while (cursor.hasNext()){
var doc = cursor.next();
print(doc.name); //把每一条数据都单独拿出来进行逐行的控制
print(doc); //将游标数据取出来后,其实每行数据返回的都是一个[object BSON]型的内容
printjson(doc); //将游标获取的集合以JSON的形式显示
}




lookup

主要功能 是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。数组列存放的数据 是 来自 被Join 集合的适配文档,如果没有,集合为空(即 为[ ])

​语法格式如下:

​{​

​$lookup:{​

​from: <collection to join>,​

​ localField: <field from the input documents>,​

​ foreignField: <field from the documents of the "from" collection>,​

​as: <output array field>     ​

​} ​​​​​

​}​

语法的解释说明


语法值


解释说明

from

同一个数据库下等待被Join的集合。

localField

源集合中的match值,如果输入的集合中,某文档没有 localField

这个Key(Field),在处理的过程中,会默认为此文档含

有 localField:null的键值对。

foreignField

待Join的集合的match值,如果待Join的集合中,文档没有foreignField

值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。

as

为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉,