MongoDB的文档操做
在MongoDB中文档是指多个键及其关联的值有序地放置在一块儿就是文档,其实指的就是数据,也是咱们平时操做最多的部分。html
MongoDB中的文档的数据结构和 JSON 基本同样。全部存储在集合中的数据都是 BSON 格式。java
BSON 是一种相似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。web
插入文档
插入单个文档
注意:正则表达式
- 新增时不须要考虑field,若是field已经存在则向指定field中新增。若是field不存在,则在collection中新添加一个filed
- 向collection中新增数据时,若是collection不存在,则自动建立collection
向dev集合中插入单个文档。mongodb
能够使用insert/insertOne/save执行新增,语法彻底相同,下面是三种写法等效:数组
db.c1.insert({name:"张三"}); db.c1.save({name:"张三"}); db.c1.insertOne({name:"张三"});
区别:数据结构
当明确给定主键时,若是主键值已经存在save表示修改,insert/insertOne会报主键重复。less
注意:(save修改必须在MongoDB的客户端操做,不能使用第三方客户端,不然没法执行成功)svg
命令中_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的做用总结:
- 只修改特定的Field,解决update默认修改整个document状况
db.c1.update({name:"张三"},{$set:{name:"王五"}});
- 默认只修改符合条件的第一个document,若是须要所有修改,添加更新参数multi:true
db.c1.update({name:"张三"},{$set:{age:18}},{multi:true});
- 若是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与 regex与options语法
s - 容许点字符(即.)匹配包括换行符在内的全部字符。须要 r e g e x 与 regex与 regex与options语法
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操做符来表示多条件查询, in操做符来表示多条件查询,in中多条件的关系为或者关系,只要知足其中一个就能被查询出来,因为$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]}})
本文同步分享在 博客“cwl_java”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。