前言
衆所周知,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,則減一