MongoDB的文档操作

在MongoDB中文档是指多个键及其关联的值有序地放置在一起就是文档,其实指的就是数据,也是我们平时操作最多的部分。

MongoDB中的文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。

BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

插入文档

插入单个文档

注意:

  1. 新增时不需要考虑field,如果field已经存在则向指定field中新增。如果field不存在,则在collection中新添加一个filed
  2. 向collection中新增数据时,如果collection不存在,则自动创建collection

向dev集合中插入单个文档。

可以使用insert/insertOne/save执行新增,语法完全相同,下面是三种写法等效:

db.c1.insert({name:"张三"});

db.c1.save({name:"张三"});

db.c1.insertOne({name:"张三"});

区别:

当明确给定主键时,如果主键值已经存在save表示修改,insert/insertOne会报主键重复。

注意:(save修改必须在MongoDB的客户端操作,不能使用第三方客户端,否则无法执行成功)

命令中_id是ObjectId类型,需要通过ObjectId函数把字符串转换为ObjectId

db.c1.save({_id:ObjectId("5e81b3ac4d4d000026004f6a"),name:"jqk"})

插入多个文档

可以使用insert/insertMany/save执行新增,区别于单条新增把新增函数参数由对象类型({})变成数组类型([{}])下面是三种写法等效:

db.c1.insert([{name:"a"},{name:"b"}]);

db.c1.insertMany([{name:"a"},{name:"b"}]);

db.c1.save([{name:"a"},{name:"b"}]);

更新文档

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

update函数

update() 函数用于更新已存在的文档。

语法格式:db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)})

其中更新内容为整个文档更新内容,如果更新内容中只有一个属性,除了_id以外其他属性将会被设置null。

先新增一条测试数据

db.c1.insert({name:"张三",age:12,address:"地址"});

修改,name改成了李四,age和address都被设置null了。(mongodb中如果一个集合中某个属性所有的文档对象都为空时会删除这个属性)

db.c1.update({name:"张三"},{name:"李四"});

更新操作符

$set操作符(需要记忆)

$set操作符:用来指定一个键并更新键值,若键不存在并创建。只能修改第一个document

语法格式:db.COLLECTION_NAME.update({查询条件},{更新操作符:{更新内容}})

$set的作用总结:

  1. 只修改特定的Field,解决update默认修改整个document情况
db.c1.update({name:"张三"},{$set:{name:"王五"}});
  1. 默认只修改符合条件的第一个document,如果需要全部修改,添加更新参数multi:true
db.c1.update({name:"张三"},{$set:{age:18}},{multi:true});
  1. 如果Field不存在,可以新建一个Field
db.c1.update({name:"张三"},{$set:{sex:"男"}})

$inc操作符

$inc操作符:可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。如果给定正数表示新增,如果给定负数表示减少。

把王五的年龄减少5岁。

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

$unset操作符

$unset操作符:主要是用来删除键。让键的值为空。在编写命令时$unset里field取值任意,无论给定什么值都表示删除。

删除名称为王五的地址。

db.c1.update({name:"王五"},{$unset:{address:"随意"}});

$push操作符

$push操作符:向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键。

向集合c1中所有文档对象添加了数组类型属性hobby,并添加一个值写代码。如果再次执行,表示向hobby中再添加一个值写代码。默认只修改符合条件的第一条,如果需要全部修改,添加multi属性。

db.c1.update({},{$push:{hobby:"写代码"}},{multi:true});
$pop操作符

$pop操作符:删除数据元素。可取值只能是1或-1。1表示尾部删除,-1表示头部删除

删除hobby中第一个元素。其中$pop中key是要操作的数组类型属性。

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

$pull操作符

$pull操作符:从数组中删除满足条件的元素,只要满足条件都删除。

删除hobby中元素内容为看尚学堂视频,如果存在多个都删除。

db.c1.update({name:“王五”},{$pull:{hobby:“看尚学堂视频”}});

$pullAll操作符

$pullAll操作符:可以设置多个条件。

删除王五中hobby为写代码和看尚学堂视频的值。其中属性(hobby)取值一定要是数组类型。

db.c1.update({name:"王五"},{$pullAll:{hobby:["写代码","看尚学堂的视频"]}});

$rename

$rename操作符:对键进行重新命名。任何类型的键都能重命名。

修改王五的name属性为username。

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

查询文档

find()函数

在MongoDB中可以使用find()函数查询文档。

语法格式为:find({查询条件(可选)},{指定投影的键(可选)})

如果未给定参数则表示查询所有数据。

db.c1.find();

查询所有name为张三的文档对象

db.c1.find({name:"张三"})

投影操作

投影查询指的就是哪些列被显示或不被显示。写到投影(projection)里面的属性可取值为1(显示)或0(不显示)。除了_id以外其他属性取值必须是相同。

sex和hobby不显示,其他属性都显示

db.c1.find({name:"张三"},{sex:0,hobby:0})

显示sex和hobby,默认_id也是显示

db.c1.find({name:"张三"},{sex:1,hobby:1})

只显示sex和hobby。只有这种情况才能出现属性取值不一样

db.c1.find({name:"张三"},{_id:0,sex:1,hobby:1})

findOne()函数

findOne()函数只返回满足条件的第一条数据。

返回第一行document对象。

db.c1.findOne();

返回名字为张三的第一条数据

db.c1.findOne({name:"张三"})

正则查询

MongoDB中查询条件也可以使用正则表达式作为匹配约束。正则表达式语法与JavaScript正则表达式语句完全相同。正则内容需要写在 / / 之前。

语法格式:db.COLLECTION_NAME.find({字段名:正则表达式});、

可以实现模糊查询

查询name中存在三的文档对象

db.c1.find({name:/三/});

db.COLLECTION_NAME.find({字段名:{$regex:正则表达式,$options:正则选项}});

第二种方式比第一种方式多了正则选项,功能更多。

正则表达式格式:/xxx/

正则选项:

i - 不区分大小写以匹配大小写的情况。

m - 多行查找,如果内容里面不存在换行符号(例如 \n)或者条件上没有(start/end),该选项没有任何效果

x - 设置x选项后,正则表达式中的非转义的空白字符将被忽略。需要 r e g e x 与 regex与 regexoptions语法

s - 允许点字符(即.)匹配包括换行符在内的所有字符。需要 r e g e x 与 regex与 regexoptions语法

i,m,x,s可以组合使用。

示例:

录入数据

db.c1.insert({name:"abc"});

db.c1.insert({name:"bcd"});

db.c1.insert({name:"ABC"});

db.c1.insert({name:"BCD"});

只能查询包含小写b的文档对象

db.c1.find({name:/b/})

查询时不区分大小写,只要包含b或B都能查询出来

db.c1.find({name:{ r e g e x : / b / , regex:/b/, regex:/b/,options:“i”}});

条件操作符

条件操作符用于比较两个表达式并从mongoDB集合中获取数据。

语法格式:find({键:{操作符:条件}})或者findOne({键:{操作符:条件}})

$gt

(>) 大于操作符,greater than 缩写。用right记忆,表示右侧角括号。

查询所有年龄大于10的文档对象

db.c1.find({age:{$gt:10}});

$lt

(<) 小于操作符。less than缩写,用left记忆,左角括号

查询所有年龄小于10的文档对象

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

$eq

(==)等于操作符,equals

查询年龄等于8

db.c1.find({age:{$eq:8}});

等效于

db.c1.find({age:8});

$ne

(!=)不等操作符 not equals

查询所有年龄不是18岁的,包含了age属性没有值的文档对象。

db.c1.find({age:{$ne:8}});

$gte

(>=)大于或等于操作符greater than equals

查询所有年龄大于等于8的文档对象。如果文档没有age属性无法被查询。

db.c1.find({age:{$gte:8}});

$lte

(<=)小于或等于操作符less than equals

查询小于等于8的文档对象。

db.c1.find({age:{$lte:8}});

$in

我们可以使用 i n 操 作 符 来 表 示 多 条 件 查 询 , in操作符来表示多条件查询, inin中多条件的关系为或者关系,只要满足其中一个就能被查询出来,由于$in取值为多个,所以是数组类型。

查询年龄为8或10或12的文档对象

db.c1.find({age:{$in:[8,10,12]}})

$nin

not in,与$in的结果取反。

只要age不是8或10或12的文档对象都能查询出来。

db.c1.find({age:{$nin:[8,10,12]}})