MongoDB文档操作
插入文档
3.2版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()
新增单个文档 insertOne: 支持writeConcern db.collection.insertOne( <document>, { writeConcern: <document> } )
writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:
0:发起写操作,不关心是否成功; 1~集群最大数据节点数:写操作需要被复制到指定节点数才算成功; majority:写操作需要被复制到大多数节点上才算成功。
insert: 若插入的数据主键已经存在,则会抛 DuplicateKeyException 异常,提示主键重复,不保存当前数据。
save: 如果 _id 主键存在则更新数据,如果不存在就插入数据。

批量新增文档
insertMany:向指定集合中插入多条文档数据 db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> } ) writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求 ordered:指定是否按顺序写入,默认 true,按顺序写入。 insert和save也可以实现批量插入

测试:批量插入50条随机数据
var tags = ["nosql","mongodb","document","developer","popular"]; var types = ["technology","sociality","travel","novel","literature"]; var books=[]; for(var i=0;i<50;i++){ var typeIdx = Math.floor(Math.random()*types.length); var tagIdx = Math.floor(Math.random()*tags.length); var favCount = Math.floor(Math.random()*100); var book = { title: "book-"+i, type: types[typeIdx], tag: tags[tagIdx], favCount: favCount, author: "xxx"+i }; books.push(book) } db.books.insertMany(books);
进入mongo shell,执行 load("books.js")
3.2 查询文档
find 查询集合中的若干文档。语法格式如下: db.collection.find(query, projection) query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。投影时,id为1的时候,其他字段必须是1;id是0的时候,其他字段可以是0;如果没有_id字段约
束,多个其他字段必须同为0或同为1。

如果查询返回的条目数量较多,mongo shell则会自动实现分批显示。默认情况下每次只显示20条,可以输入it命令读取下一批。
findOne查询集合中的第一个文档。语法格式如下
db.collection.findOne(query, projection)

条件查询
指定条件查询 #查询带有nosql标签的book文档: db.books.find({tag:"nosql"}) #按照id查询单个book文档: db.books.find({_id:ObjectId("61caa09ee0782536660494d9")}) #查询分类为“travel”、收藏数超过60个的book文档: db.books.find({type:"travel",favCount:{$gt:60}})
查询条件对照表
|
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}} |
查询逻辑对照表

查询逻辑运算符
$lt: 存在并小于 $lte: 存在并小于等于 $gt: 存在并大于 $gte: 存在并大于等于 $ne: 不存在或存在但不等于 $in: 存在并在指定数组中 $nin: 不存在或不在指定数组中 $or: 匹配两个或多个条件中的一个 $and: 匹配全部条件

排序&分页
指定排序 在 MongoDB 中使用 sort() 方法对数据进行排序 #指定按收藏数(favCount)降序返回 db.books.find({type:"travel"}).sort({favCount:-1})
分页查询
skip用于指定跳过记录数,limit则用于限定返回结果数量。可以在执行find命令的同时指定skip、limit 参数,以此实现分页的功能。比如,假定每页大小为8条,查询第3页的book文档 db.books.find().skip(8).limit(4)
正则表达式匹配查询
MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。 //使用正则表达式查找type包含 so 字符串的book db.books.find({type:{$regex:"so"}}) //或者 db.books.find({type:/so/})
更新文档
可以用update命令对指定的数据进行更新,命令的格式如下:
db.collection.update(query,update,options)
query:描述更新的查询条件;
update:描述更新的动作及新的内容;
options:描述更新的选项
upsert: 可选,如果不存在update的记录,是否插入新的记录。默认false,不插入
multi: 可选,是否按条件查询出的多条记录全部更新。 默认false,只更新找到的第一条记录
writeConcern :可选,决定一个写操作落到多少个节点上才算成功。
更新操作符
|
操作符 |
格式 |
描述 |
|
$set |
{$set:{field:value}} |
指定一个键并更新值,若键不存在则创建 |
|
$unset |
{$unset : {field : 1 }} |
删除一个键 |
|
$inc |
{$inc : {field : value } } |
对数值类型进行增减 |
|
$rename |
{$rename : {old_field_name : new_field_name } } |
修改字段名称 |
|
$push |
{ $push : {field : value } } |
将数值追加到数组中,若数组不存在则会进行初始化 |
|
$pushAll |
{$pushAll : {field : value_array }} |
追加多个值到一个数组字段内 |
|
$pull |
{$pull : {field : _value } } |
从数组中删除指定的元素 |
|
$addToSet |
{$addToSet : {field : value } } |
添加元素到数组中,具有排重功能 |
|
$pop |
{$pop : {field : 1 }} |
删除数组的第一个或 后一个元素 |
更新单个文档
某个book文档被收藏了,则需要将该文档的favCount字段自增 db.books.update({_id:ObjectId("61caa09ee0782536660494d9")},{$inc:{favCount:1}})

更新多个文档
默认情况下,update命令只在更新第一个文档之后返回,如果需要更新多个文档,则可以使用multi选项。
将分类为“novel”的文档的增加发布时间(publishedDate)
db.books.update({type:"novel"},{$set:{publishedDate:new Date()}},{"multi":true})
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新

update命令的选项配置较多,为了简化使用还可以使用一些快捷命令:
updateOne:更新单个文档。
updateMany:更新多个文档。
replaceOne:替换单个文档。
使用upsert命令
upsert是一种特殊的更新,其表现为如果目标文档不存在,则执行插入命令 db.books.update( {title:"my book"}, {$set:{tags:["nosql","mongodb"],type:"none",author:"fox"}}, {upsert:true} ) nMatched、nModified都为0,表示没有文档被匹配及更新,nUpserted=1提示执行了upsert动作

实现replace语义
update命令中的更新描述(update)通常由操作符描述,如果更新描述中不包含任何操作符,那么
MongoDB会实现文档的replace语义
db.books.update( {title:"my book"}, {justTitle:"my first book"} )

findAndModify命令
findAndModify兼容了查询和修改指定文档的功能,findAndModify只能更新单个文档
//将某个book文档的收藏数(favCount)加1 db.books.findAndModify({ query:{_id:ObjectId("61caa09ee0782536660494dd")}, update:{$inc:{favCount:1}} })
该操作会返回符合查询条件的文档数据,并完成对文档的修改

默认情况下,findAndModify会返回修改前的“旧”数据。如果希望返回修改后的数据,则可以指定new选项
db.books.findAndModify({ query:{_id:ObjectId("61caa09ee0782536660494dd")}, update:{$inc:{favCount:1}}, new: true })
与findAndModify语义相近的命令如下:
findOneAndUpdate:更新单个文档并返回更新前(或更新后)的文档。
findOneAndReplace:替换单个文档并返回替换前(或替换后)的文档
删除文档
使用 remove 删除文档
remove 命令需要配合查询条件使用;
匹配查询条件的文档会被删除;
指定一个空文档条件会删除所有文档;
示例:
db.user.remove({age:28})// 删除age 等于28的记录
db.user.remove({age:{$lt:25}}) // 删除age 小于25的记录
db.user.remove( { } ) // 删除所有记录
db.user.remove() //报错
remove命令会删除匹配条件的全部文档,如果希望明确限定只删除一个文档,则需要指定justOne参数,命令格式如下 db.collection.remove(query,justOne) 例如:删除满足type:novel条件的首条记录 db.books.remove({type:"novel"},true)
使用 delete 删除文档
官方推荐使用 deleteOne() 和 deleteMany() 方法删除文档,语法格式如下: db.books.deleteMany ({}) //删除集合下全部文档 db.books.deleteMany ({ type:"novel" }) //删除 type等于 novel 的全部文档 db.books.deleteOne ({ type:"novel" }) //删除 type等于novel 的一个文档 注意: remove、deleteMany等命令需要对查询范围内的文档逐个删除,如果希望删除整个集合,则使用drop命令会更加高效
返回被删除文档
remove、deleteOne等命令在删除文档后只会返回确认性的信息,如果希望获得被删除的文档,则可以 使用findOneAndDelete命
db.books.findOneAndDelete({type:"novel"})

除了在结果中返回删除文档,findOneAndDelete命令还允许定义“删除的顺序”,即按照指定顺序删除找到的第一个文档 db.books.findOneAndDelete({type:"novel"},{sort:{favCount:1}}) remove、deleteOne等命令只能按默认顺序删除,利用这个特性,findOneAndDelete可以实现队列的先进先出
query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参 数即可(默认省略)。投影时,id为1的时候,其他字段必须是1;id是0的时候,其他字段可以是 0;如果没有_id字段约束,多个其他字段必须同为0或同为1。

浙公网安备 33010602011771号