MongoDB数组修改器更新数据
这里,我们将了解一下数组修改器。数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用。数组修改器,顾名思义,它是用来修改数组的,而不能用来修改整数或者字符串。数组修改器不多,就那么几个,但熟练掌握它后,将给我们带来非常方便的操作。下面,我们来了解一下:
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "deng",
"lname" : "pan"
},
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "dongren",
"lname" : "zeng"
}
]
}
以上是我的还在完善中的个人信息文档。假设最近我又交了一个好朋友,我想把他加到我的人际关系“relationships”数组中。这时,$push修改器就派上用场了。$push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。下面我们把新朋友加进去。
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$push:{"relationships":{"fname":"xiong","lname":"lan"}}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "deng",
"lname" : "pan"
},
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "dongren",
"lname" : "zeng"
},
{
"fname" : "xiong",
"lname" : "lan"
}
]
}
有加就有减,那么怎么对数组进行“减”操作呢。能达到对数组“减”目的的修改器有两个,$pop和$pull。$pop和$pull又有区别,我们来分别实验。首先是$pop
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pop:{"relationships":1}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "deng",
"lname" : "pan"
},
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "dongren",
"lname" : "zeng"
}
]
}
从上面可以看出,它把我们刚加进去的朋友又删除了,也就是说它从数组的最后删除。那么,如果我们想从数组的开头删除该怎么办呢。很简单,把上面的“1”改成“-1”,它将逆向操作。下面看一下:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pop:{"relationships":-1}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "dongren",
"lname" : "zeng"
}
]
}
从结果可以看出,它达到了我们预期的目的。那么如果我们想删除数组中间的呢。这时,$pull派上用场。首先,我们先将新朋友加进去,这里我不再演示。但我们可以想到“dongren”这个人是在数组的中间。现在我们要将他删除:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pull:{"relationships":{"fname":"dongren","lname":"zeng"}}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "xiong",
"lname" : "lan"
}
]
}
从上面可以看出,$pull可以将数组中间的数据删除。这里还有一点要注意,$pull会将所有匹配到的数据都删除,这里我就不做实验了。下面,我们再来看看$push还有什么特点,我们再往数组里插入一相同的数据,看看会如何:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$push:{"relationships":{"fname":"xiong","lname":"lan"}}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "xiong",
"lname" : "lan"
},
{
"fname" : "xiong",
"lname" : "lan"
}
]
}
结果表明,它是能正常插入到数组的。而在实际生产环境中,我们都不想看到这样的结果,那么,这里又出现了两个可以用的修改器:$ne和$addToSet。$ne主要拿来判断,若数组里面有这个值,则不插入;没有才插入。
> db.user.update({"relationships.fname":{$ne:"xiong"}},{$set:{"fname":"xiong","lname":"lan"}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "xiong",
"lname" : "lan"
},
{
"fname" : "xiong",
"lname" : "lan"
}
]
}
由结果可以看出,由于该数据在数组中已经存在,所以不再插入。其实,$addToSet比$ne更好用,它可以自己判断数据是否存在,而且它和$each结合使用,还能同时在数组中插入多个数据,这是$ne没办法办到的,下面我们来看一下$addToSet的用法,这里顺便结合了$each的使用:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},
{$addToSet:{"relationships":{$each:[{"fname":"xiong","lname":"lan"},
{"fname":"dongren","lname":"zeng"}]}}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "xiong",
"lname" : "lan"
},
{
"fname" : "xiong",
"lname" : "lan"
},
{
"fname" : "dongren",
"lname" : "zeng"
}
]
}
在修改语句中,我们想同时插入{"fname":"xiong","lname":"lan"},
{"fname":"dongren","lname":"zeng"}两个数据,但在原数组中,
{"fname":"xiong","lname":"lan"}这个数据已经存在,所以它只插入了后面那条。达到了我们想要的目的。所以,我个人更喜欢使用$addToSet。
有时候数组有多个值,而我们只想对其中的一部分进行操作。如果我们把整个文档都抄下来,那太麻烦也太愚蠢了。好在mongodb给我们提供了两种简便方法:通过位置或者操作符“$”。下面我们来分别看看这两种方法怎么使用。首先是通过数组位置来操作。数组都是以0开头的,可以将下标直接作为键来选择元素。例如,我们想给数组的第一个数据加上年龄键值对,我们可以这么操作:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$set:{"relationships.0.age":22}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"age" : 22,
"fname" : "qiang",
"lname" : "he"
},
{
"fname" : "deng",
"lname" : "pan"
},
{
"fname" : "xiong",
"lname" : "lan"
}
]
}
可是很多情况下,不预先查询文档我们就不知道要修改数组的元素的下标。这时定位操作符“$”就很好用了。它就是用来定位查询文档已匹配的元素,并进行更新。我们来看看它怎么用:
> db.user.update({"relationships.fname":"xiong"},{$set:{"relationships.$.age":22}})
> db.user.findOne()
{
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorite" : {
"1" : "reading",
"2" : "swimming",
"3" : "listening music"
},
"fname" : "jeff",
"height" : 166,
"lname" : "jiang",
"relationships" : [
{
"age" : 22,
"fname" : "qiang",
"lname" : "he"
},
{
"age" : 22,
"fname" : "deng",
"lname" : "pan"
},
{
"age" : 22,
"fname" : "xiong",
"lname" : "lan"
}
]
}

MongoDB数组修改器更新数据相关推荐

  1. MongoDB 查询篇 及 数组修改器更新数据

    查询方法 1. 查询方法 mongoose查询使用最基础的方法就是find.findOne方法,前者查询所有满足条件的值,后者取满足条件的某一个值. 2. 查询条件 mongoose查询条件其实就是在 ...

  2. MongoDB update修改器: 针对Fields的$修改器 $inc $set $unset

    MongoDB update修改器: $inc $set $unset $push $pull $pop 针对Fields的$修改器 $set: { $set: { key: value } } $s ...

  3. MongoDB数据库更新操作的十种修改器的使用

    提示:下面代码中所操作的集合都已经插入到数据库中了,只是对MongoDB十种修改器的基本介绍 # 首先贴出一个每次修改完以后都会使用的语句:查询 db.student.find({"name ...

  4. Mongodb修改器

    对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新.更新修改器是中特殊的键, 用来指定复杂的操作,比如增加.删除或者调整键,还可能是操作数组或者内嵌 ...

  5. mongoDB的shell数组操作器

    http://www.2cto.com/database/201304/205024.html mongoDB数组操作器 $push会向数组末尾加入一个元素,如果数组不存在,则会创建这个数组. 增加评 ...

  6. mongodb php代码实例,MongoDB文档的更新(php代码实例)

    MongoDB更新文档分为两大类: 文档替换,使用新文档完全替换掉旧文档 修改器,修改部分文档 文档替换 使用文档替换非常的简单,下面来看演示: $collect->insertOne(['na ...

  7. mongodb php update,MongoDB文档的更新(php代码实例)

    MongoDB更新文档分为两大类:文档替换,使用新文档完全替换掉旧文档 修改器,修改部分文档 文档替换 使用文档替换非常的简单,下面来看演示:$collect->insertOne(['name ...

  8. mongo 修改器 $inc/$set/$unset/$pop/$push/$pull/$addToSet

    mongo $inc 可以对集合里面的某些值是数字的增减.看代码 $set  可以进行修改,并且不存在的时候默认添加. 同时还能该变数据的类型. 还可以该变内嵌元素的值 用.调用 $unset  删除 ...

  9. MongoDB 文档的更新操作

    在MongoDB中,更新单个doc的操作是原子性的.默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的 ...

最新文章

  1. Android-应用性能测试
  2. 计算机房装修对门的要求,防火门尺寸要求有哪些 防火门尺寸规范
  3. mysql6支持connect by_mysql 实现oracle start with connect by递归
  4. javascript中的原型
  5. 计算机无法备份,电脑无法备份怎么办
  6. Asp.Net中的三种分页方式总结
  7. udhcp源码详解(二)--转
  8. UEditor手动调节其宽度
  9. Mac上的免费数据库可视化工具:Sequel Pro
  10. 联想小新系列笔记本 黑苹果BIOS配置
  11. Keras入门(2)——麻雀虽小,五脏俱全
  12. html java实训心得,学习中关于HTML的总结与一些心得
  13. 借助智能手机应用程序和可穿戴设备在夏季塑造身材
  14. 几个工程符号 T,G,M,K,f,p,n
  15. c语言赋值运算与除法运算顺序,C语言运算符的优先级和结合律
  16. python常用模块总结(嵌入式日志分析)
  17. 国际知名营养品牌排行榜前十位
  18. Android音量调节的实现(RingtoneManager和RingerVolumePreference)
  19. webview加载assets目录下html静态文件
  20. [QQ飞车]AMD双核CPU可以异常加速QQ飞车,此BUG堪比外挂

热门文章

  1. Basics of Apache Ant
  2. 华硕pro系列笔记本,右击文件出现闪退现象解决办法
  3. 华为od机考题目-欢乐的周末
  4. win7蓝屏0x000000f4修复_Windows7系统大规模蓝屏?罪魁祸手到底是谁?
  5. 普乐蛙7d影院设备|4d立体电影院|移动式5D影院
  6. 【Vue】V-if成立时,元素出现;不成立时,元素不显示。
  7. 操作系统 进程 线程
  8. 研究生写脚本抢HPV九价疫苗:被采取强制措施,后果严重
  9. go语言中的文件file操作
  10. 树,时间复杂度 个人总结