Mongo学习笔记——数组操作
在MongoDB中,数据被存储为一个文档,数据结构有键值对组成。在文档中可以存储一个Object数组,本次就来了解如何对此类数组进行操作。
现有数据如下:
以上是一个个人信息文档,而一个人可以学到的技能是会变化的。当需要增加一个技能:
db.getCollection('applicant').update({"_id" : ObjectId("5ba993cc929a972684cdb2a5")},{$push:{"skill":{"skill_exp":"了解","skill_name":"C"}}})
$push的作用就是向已有的数组加入一个元素,不过push是不会检查是否有重复数据的,所以如果用push多次增加,相同的数据也会被重复存储。若是想要避免这种现象,就需要使用 $addToSet。
db.getCollection('applicant').update({"_id" : ObjectId("5ba993cc929a972684cdb2a5")},{$addToSet:{"skill":{"skill_exp":"了解","skill_name":"C"}}})
结果如下:
并没有出现多个C的技能描述。
而在对数组进行删除操作时,也有两种方式,分别是$pop和 $pull。
$pop:
db.getCollection('applicant').update({"_id" : ObjectId("5ba993cc929a972684cdb2a5")},{$pop:{"skill":1}})
$pull:
db.getCollection('applicant').update({"_id" : ObjectId("5ba993cc929a972684cdb2a5")},{$pull:{"skill":{"skill_exp":"了解","skill_name":"C"}}})
结果如下:
这两者的区别在于$pop是在数组的尾部与头部进行删除,而 $pull则是进行匹配删除(注意:pull不是只删除一条,他会删除所有匹配的元素)。
当需要对数组的部分值进行更新,则需要使用定位操作符:$
db.getCollection('applicant').update({$and:[{"_id" : ObjectId("5ba993cc929a972684cdb2a5")},{"skill.skill_name" : "C#"}]},{$set:{"skill.$.skill_exp":"熟悉"}})
结果如下: