前言
众所周知,mongodb以类似json的数据格式——bson储存数据,它允许数据之间相互嵌套,所以说,查找、修改嵌套比较深的字段就成了一个问题。假设有那么一个collection
{
"_id" : ObjectId("5a3672b2c0e07c5f2ab47f06"),
"type" : [
{
"name" : "JavaScript",
"number" : 2
},
{
"name" : "node.js",
"number" : 1
}
]
}
其type字段是一个数组,数组的元素是若干个拥有name字段与number字段的对象。不难看出这个集合记录的是某个博客或者类似系统文章的类型及数量——类似的结构应该是非常常见的
问题
那么,问题来了,如果某天我们新添加了一篇关于JavaScript的文章,那么JavaScript对应的number应该加一。这应该如何操作呢?
这个时候就需要用到$操作符了,完整的update语句如下:
db.collectionName.update({"type.name":"JavaScript"},{$inc:{"type.$.number":1}})
其中需要注意以下几点:
1.{"type.name":"JavaScript"}
用于在type中找到name为JavaScript的对象
2.$inc
用于对文档的某个值为数字型的键进行增减的操作
3.”type.$.number"
中"$"
操作符将查询结果中的数组的内容限制为只包含与查询文档相匹配的第一个元素,在这里有mongodb官方的示例,里面展示了多种情况下$
的作用
4.{$inc:{"type.$.number":1}}
的作用就是让type中name为JavaScript的对象的number的值加一,如果最后的数值是-1,则减一