提供了两类函数:save()、update()
update函数语法要求比较麻烦:db.集合.update(更新条件,新的对象数据(更新操作符) , upsert , multi)
-
upsert:如果要更新的数据不存在,则增加一条新的内容(true增加、false不增加)
-
multi:是否只更新满足条件的第一行记录(false只更新第一行,true全部更新)
-
save():没有update好用,一般用update
-
update():
例如:将年龄是19岁的人的成绩都更新为100分:
此时会有多条数据,我们选择只更新第一条数据:db.students.update({'age':19},{ '$set':{'score':100}},false,false)
上面是更新存在的数据,现在来更新不存在的数据:
例如:将年龄是30的人名称设置为“不存在”
db.students.update({'age':30},{'$set':{'name':'不存在'}},true,false)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5beb83eadcc6a522cf0605f2")
})
查询一下:
db.students.find()
{ "_id" : ObjectId("5be9271d16d1fcb72bc0dd41"), "name" : "张三", "sex" : "男", "age" : 19, "score" : 100, "address" : "西湖区" }
{ "_id" : ObjectId("5be9274916d1fcb72bc0dd42"), "name" : "李思", "sex" : "男", "age" : 20, "score" : 69, "address" : "拱墅区" }
{ "_id" : ObjectId("5be9277416d1fcb72bc0dd43"), "name" : "王五", "sex" : "女", "age" : 18, "score" : 100, "address" : "余杭区" }
{ "_id" : ObjectId("5be9278a16d1fcb72bc0dd44"), "name" : "赵柳", "sex" : "女", "age" : 17, "score" : 66, "address" : "余杭区" }
{ "_id" : ObjectId("5be927af16d1fcb72bc0dd45"), "name" : "刘琦", "sex" : "女", "age" : 21, "score" : 0, "address" : "上城区" }
{ "_id" : ObjectId("5be93fb416d1fcb72bc0dd46"), "name" : "测试-A", "course" : [ "语文", "数学", "英语" ] }
{ "_id" : ObjectId("5be93fc016d1fcb72bc0dd47"), "name" : "测试-B", "course" : [ "语文", "数学" ] }
{ "_id" : ObjectId("5be93fd616d1fcb72bc0dd48"), "name" : "测试-C", "course" : [ "语文", "数学", "英语", "科学" ] }
{ "_id" : ObjectId("5bea316f16d1fcb72bc0dd49"), "name" : "测试-D", "course" : [ "数学", "英语", "科学" ] }
{ "_id" : ObjectId("5bea488e16d1fcb72bc0dd4a"), "name" : "王木木-A", "sex" : "男", "age" : 19, "score" : 89, "address" : "西湖区", "course" : [ "语文", "数学" ], "parents" : [ { "name" : "王木木-A-父亲", "age" : 55 }, { "name" : "王木木-A-母亲", "age" : 56 } ] }
{ "_id" : ObjectId("5bea48ed16d1fcb72bc0dd4b"), "name" : "王木木-B", "sex" : "男", "age" : 19, "score" : 89, "address" : "西湖区", "course" : [ "语文", "英语" ], "parents" : [ { "name" : "王木木-B-父亲", "age" : 51 }, { "name" : "王木木-B-母亲", "age" : 53 } ] }
{ "_id" : ObjectId("5beb83eadcc6a522cf0605f2"), "age" : 30, "name" : "不存在" }
修改器:
在MongoDB中,数据的修改会牵扯到内容的变更、结构的变更(因为是无模式),所以其提供了一系列修改器,比如“$set”。
$set:上面例子已经说过了
$inc:主要针对于一个数字字段,增加某个数字字段的数据内容;语法:{‘$inc’:{成员:内容}}
例如:将年龄19岁的学生成绩减少30分,年龄加一岁:
db.students.update({'age':19},{'$inc':{'score':-30,'age':+10}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
查询后发现只有一条满足条件的数据被修改了,(一共有三条满足19岁的数据),这是因为multi默认是false,也就是只更新第一行数据。
$unset:删除某个成员的内容:语法:{‘$unset’:{‘成员’:1}}
例如:删除张三这个学生的年龄和成绩:
db.students.update({'name':'张三'},{'$unset':{'age’:1,'score':1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.students.find()
{ "_id" : ObjectId("5be9271d16d1fcb72bc0dd41"), "name" : "张三", "sex" : "男","address" : "西湖区" }
$push:将内容追加到指定的成员中(基本是数组):语法:{‘$push’:{成员:value}}
例如给张三添加课程信息(课程信息是数组,此时张三里面没有课程信息):
db.students.update({'name':'张三'},{'$push':{'course':['语文','政治']}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.students.find()
{ "_id" : ObjectId("5be9271d16d1fcb72bc0dd41"), "name" : "张三", "sex" : "男", "score" : 70, "address" : "西湖区", "course" : [ [ "语文", "政治" ] ] }
…
这样写会有点问题,课程的数据结构变成数组嵌套数组的。。。因为$push追加内容默认结构就已经是数组了。
如果是给一个已经有课程信息(数组)的学生添加:
db.students.update({'name':'测试-B'},{'$push':{'course':['生物','政治’]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.students.find()
{ "_id" : ObjectId("5be93fc016d1fcb72bc0dd47"), "name" : "测试-B", "course" : [ "语文", "数学", [ "生物", "政治" ] ] }
可以看出 还是变成了数组嵌套数组,所以我们这个value只能写一个值。
那么我们就是想一次推多个值进去呢?使用:
$pushAll:与push类似,可以一次追加多个内容到数组里,语法:{‘$oushAll’:{成员:数组内容}}
例如向李思同学中添加对个课程内容:
db.students.update({'name':'李思'},{'$pushAll':{'course':['生物','政治']}})
注意;mongodb很早前的版本就合并了$push和$pushAll,然后mongodb 3.6取消了$pushAll所以要么mongodb降级到3.4,要么mongoose升级到5.0 rc2
$addToSet:向数组里面增加一个新的内容,只有这个内容不存在的时候才会增加:语法:{‘$addToSet’:{成员:内容}}
例如:测试A的课程中新增政治:
db.students.update({'name':'测试-A'},{'$addToSet':{'course':'政治'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
{ "_id" : ObjectId("5be93fb416d1fcb72bc0dd46"), "name" : "测试-A", "course" : [ "语文", "数学", "英语", "政治" ] }
$pop:删除数组内的数据:语法:{‘$pop’:{成员:内容}},内容设置为1:删除最后一个,设置为-1:删除第一个
$pull:删除数组内指定内容的数据:语法:{‘$pull’:{成员:数据}} 数据就是用来比对的,如果是这个数据就删除掉。
$pullAll:一次性删除多个内容:语法:{‘$pullAll’:{成员:[数据A,数据B…]}}
$rename:为成员名称重命名:语法:{‘$rename’:{旧的成员名称:新的成员名称}}
网友评论