作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用。文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded)
查询内嵌文档
如果要通过内嵌文档来对文档进行查询, 此时属性名必须使用引号
示例:
- 在test库中,存在一个
col
集合,集合中数据如下
要求: 查询hobby
中,movies
包含超脱
的文档, 查询代码如下:
db.col.find({"hobby.movies":"超脱"}).pretty()
查询结果
修改内嵌文档
向内嵌文档添加值
向内嵌文档添加值需要使用到 一个数组更新操作符$push
: 用于向数组中追加值
示例: 环境同上, 向内嵌文档movies
中添加 平凡的世界
, 代码如下:
db.col.update({name:"龙猫不热"},{$push:{"hobby.movies":"平凡的世界"}})
返回结果 return: WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
再次查询
注意: 现在movies
中已经有了平凡的世界
这个值了, 现在如果我们再运行一遍, 那么会在后面继续重复添加
如果我们需要让movies
中的值不重复, 那么需要使用到一个新的操作符$addToSet
: 向数组中添加一个新元素, 如果数组中已经存在
了该元素, 则不会添加
修改代码: db.col.update({name:"龙猫不热"},{$addToSet:{"hobby.movies":"平凡的世界"}})
运行后显示修改为0
数组中也没有再添加一遍平凡的世界
删除内嵌文档中指定的值
使用操作符 $pull
$pull
: 数组中符合条件的值将被删除> db.col.update({name:"龙猫不热"},{$pull:{"hobby.movies":"平凡的世界"}})))))
运行代码后可以看出movies
中值为平凡的世界
的数据已经被删除掉了