1. 程式人生 > >mongodb如何更新陣列中巢狀的物件

mongodb如何更新陣列中巢狀的物件

前言

眾所周知,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,則減一