美文网首页
MongoDB-更新

MongoDB-更新

作者: 许先森的许 | 来源:发表于2018-11-14 11:43 被阅读5次

提供了两类函数: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’:{旧的成员名称:新的成员名称}}

相关文章

  • MongoDB-更新

    提供了两类函数:save()、update()update函数语法要求比较麻烦:db.集合.update(更新条件...

  • MongoDB-基础使用(二)

    前置文章:MongoDB-基础使用(一)[https://www.jianshu.com/p/7bca353127...

  • MongoDB-基础使用(三)

    前置文章:MongoDB-基础使用(一)[https://www.jianshu.com/p/7bca353127...

  • Mongodb-主从

    docker inspect --format '{{ .NetworkSettings.IPAddress }}...

  • MongoDB-序

    NOSql :not only sql 显示开发中一直存在一个问题: 数据表 — JDBC读取 — POJO(V...

  • MongoDB-查询

    任何数据库中查询都是最麻烦的,在MongoDB中对于查询的支持非常到位,有关系运算,逻辑运算,数组运算等等首先对于...

  • MongoDB-基础

    在了解了SpringData JPA 对MongoDB的封装之后,觉得还是有必要了解一下MongoDB本身的基础操作

  • MongoDB-简介

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB 旨在为WEB应用提...

  • mongodb-基础

    第1章 关系型与非关系型 第2章 mongo和mysql数据对比 第3章 MongoDB特点 第4章 mongo应...

  • mongodb 数据库 安装步骤

    SQL- 结构化查询语言- 关系数据库全都同SQL来操作 1.安装MongoDB- 安装- 配置环境变量C:\Pr...

网友评论

      本文标题:MongoDB-更新

      本文链接:https://www.haomeiwen.com/subject/poidfqtx.html