插入文档
文档的数据结构和 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函数来更新集合中的文档;
update
db.collection.update(): 向集合中更新文档。
语法格式如下:
db.collection.update(query,update,options)
例子:
更新操作符
操作符 | 格式 | 描述 | 例子 |
$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(): 向集合中更新文档。
deleteOne
db.collection.deleteOne(): 移除集合中的第一条数据。
deleteMany
db.collection.deleteMany(): 移除集合中的全部数据。
findOneAndDelete
db.collection.deleteMany():删除文档后并且返回信息
查询文档
find
db.collection.find(
query,
projection
)
例子:
查询条件对照表
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
例子:
排序
sort() 方法对数据进行排序
例子:
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 分钟内未对游标进行操作。
以下语句显示使用游标查找所有文档:
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 | 为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉, |