Mongodb对内嵌数组的增删改
首先构造一些数据
1 db.student.insert({
2 name:‘hunter’,
3 courses:[{ name:‘英语’, classRoom:‘1001’},{ name:‘高等数学’, classRoom:‘1001’}]
4 })
1、新增操作,往courses新增一个课程
db.student.update({name:‘hunter’},{ $addToSet: {courses:{ name:‘复变函数’, classRoom:‘1002’} } })
重复执行一下以上指令,发现并没有再新增一个课程,相同的数据只写入一次。
那么要插入重复元素怎么处理,用关键字 p u s h 替 代 push替代 push替代addToSet,其他的不变,执行完后,可以发现,数据里有两门一样的复变函数课程。
db.student.update({name:‘hunter’},{ $push: {courses:{ name:‘复变函数’, classRoom:‘1002’} } })
2、删除操作
下面来看看把复变函数这门课程进行删除
使用$pull
db.student.update({name:‘hunter’},{ KaTeX parse error: Expected 'EOF', got '}' at position 52: …Room:'1002'} } }̲) 执行完之后,会发现,关于复…pull会把匹配的数据全部删除。
使用$pop操作符,该使用场景应该还是比较少的
db.student.update({name:‘hunter’},{ $pop: {courses:1 } })
该操作会把在数组的最后一个元素进行删除,如果把1修改成-1,那么删除的数组的第一个元素。
3、修改操作
db.student.update({name:‘hunter’,‘courses.name’:‘英语’},{ KaTeX parse error: Expected '}', got 'EOF' at end of input: set: {'courses..classRoom’:‘1008’} })
s
e
t
操
作
符
执
行
后
,
如
果
记
录
匹
配
到
多
条
,
用
set操作符执行后,如果记录匹配到多条,用
set操作符执行后,如果记录匹配到多条,用只进行了第一个元素的更改,需要多条修改那么用
[
]
,
如
果
指
定
下
标
修
改
,
那
么
把
[],如果指定下标修改,那么把
[],如果指定下标修改,那么把修改为元素的下标即可,索引从0开始,update修改也只是修改匹配的第一条记录,如果要多条,使用updateMany()或者options设置为multi:true;
4、查询
假设当前数据是这样的。
1
{name:‘hunter’,courses:[{ name:‘英语’, classRoom:‘1001’},{ name:‘复变函数’, classRoom:‘1001’}]
1
{name:‘tom’,courses:[{ name:‘英语’, classRoom:‘1001’},{ name:‘复变函数’, classRoom:‘1002’}]
这个查询全部的记录都会查出来。
1
db.student.find({‘courses.classRoom’:‘1001’,‘courses.name’:‘复变函数’})
严格匹配查询,这样只有hunter的记录能查询出来。
//匹配出正确的文档
db.student.find({‘courses’:{$elemMatch:{‘classRoom’:‘1001’,‘name’:‘复变函数’}}})
//这个是匹配出正确的文档后,再筛选指定的数据,find的第二个参数是个project,虽然与查询参数是一样的,作用倒是不同。
db.student.find({‘courses’:{KaTeX parse error: Expected 'EOF', got '}' at position 45: …,'name':'复变函数'}}̲},{'courses':{elemMatch:{‘classRoom’:‘1001’,‘name’:‘复变函数’}}})