搜尋

首頁  >  問答  >  主體

mongodb內嵌文檔查找與修改問題

資料的格式是這樣的:

{
    "_id" : 1,
    "people_id" : 1,
    "albums" : [
        {
            "id" : 1,
            "name" : "123",
            "privilege" : 0,
        },
        {
            "id" : 2,
            "name" : "Q",
            "privilege" : 5,
        },
        {
            "id" : 3,
            "name" : "Q",
            "privilege" : 5,
        },
    ]
}

{
    "_id" : 2,
    "people_id" : 2,
    "albums" : [
        {
            "id" : 1,
            "name" : "4",
            "privilege" : 0,
        },
        {
            "id" : 2,
            "name" : "5",
            "privilege" : 0,
        }
    ]
}

現在我想的是
1 , 查詢people_id 為 1 且 privilege 為 5的內嵌文檔,mongodb的查詢命令怎麼寫的啊

2,更新people_id 為 2 且權限為 id為2的內嵌文件的name欄位值為 6,更新指令怎麼寫的啊

查詢我用
db.find({"people_id" : 1,"albums":{"$elemMatch" : {"privilege" : 5}}})
來嘗試匹配過,但是匹配出了:

{
    "_id" : 1,
    "people_id" : 1,
    "albums" : [
        {
            "id" : 1,
            "name" : "123",
            "privilege" : 0,
        },
        {
            "id" : 2,
            "name" : "Q",
            "privilege" : 5,
        },
        {
            "id" : 3,
            "name" : "Q",
            "privilege" : 5,
        },
    ]
}

我並不想要id為1的那個,只想唯一匹配id為2和3那個

修改,我確實不會,
還請大家幫忙提下解決方法,非常謝謝咯!

ringa_leeringa_lee2796 天前1215

全部回覆(3)我來回復

  • ringa_lee

    ringa_lee2017-04-24 09:14:57

    查詢語句可以簡化一下,如下:

    db.demo.find({"people_id" : 1, "albums.privilege": 5})
    

    查詢結果返回的是滿足匹配條件的文檔,雖然可以映射返回的字段,不過還真不能只返回你說的id为2和3的文檔。不過既然已經得到了符合條件的json文檔,可以寫程式來取得想要的內嵌子文檔吧。

    更新語句如下:

    db.demo.update({people_id:2, "albums.id":2}, { $set : {"albums.$.name":6 }})
    

    不過只是更新數組中第一個匹配的子文檔,不過albums.id看起來是唯一的,應該能滿足你的需求。

    回覆
    0
  • 迷茫

    迷茫2017-04-24 09:14:57

    關於#1是有解決方案的。 $elemMatch 同樣可以用在find方法的第二個參數來限制傳回數組內的元素。如下:

    db.demo.find({"albums.privilege":5, people_id:1}, {"albums":{$elemMatch:{privilege:5}}})
    

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-24 09:14:57

    你子文檔id是自增的嗎?

    回覆
    0
  • 取消回覆