2014-04-08 61 views
0

我有文件類似下面MongoDB中:如何更新另一嵌入式數據中的嵌入式數據?

另一個嵌入的數據結構(任務)的內部
{ 
    "_id": "test", 
    "tasks": [ 
     { 
      "Name": "Task1", 
      "Parameter": [ 
       { 
        "Name": "para1", 
        "Type": "String", 
        "Value": "*****" 
       }, 
       { 
        "Name": "para2", 
        "Type": "String", 
        "Value": "*****" 
       } 
      ] 
     }, 
     { 
      "Name": "Task2", 
      "Parameter": [ 
       { 
        "Name": "para1", 
        "Type": "String", 
        "Value": "*****" 
       }, 
       { 
        "Name": "para2", 
        "Type": "String", 
        "Value": "*****" 
       } 
      ] 
     } 
    ] 
} 

埋設有數據結構(參數)。現在我想更新Task1參數中的para1。

我已經嘗試了很多方法,但我只能使用查詢tasks.Parameter.name來查找para1但無法更新它。文檔中的示例使用.$.來更新嵌入式數據結構中的值,但在我的情況下它不起作用。

任何人有任何想法?

+1

準確顯示您嘗試過多少種方法。所以我們不會嘗試你嘗試過的很多方法。 –

回答

0

MongoDB目前只支持位置運算符一次,而且只支持頂級數組。有一張票SERVER-831來改變你的用例的這種行爲。你可以在那裏追蹤問題並投票。

但是,您可能會改變方法來完成您想要做的事情。一種方法是改變你的模式。關閉任務名稱爲數組,以便文檔看起來是這樣的:

{ 
_id:test, 
tasks: 
[ 
    { 
     Task:1 
     Name:para1, 
     Type:String, 
     Value:***** 
    }, 
    { 
     Task:1 
     Name:para2, 
     Type:String, 
     Value:***** 
    }, 
    { 
     Task:2 
     Name:para1, 
     Type:String, 
     Value:***** 
    }, 
    { 
     Task:2 
     Name:para2, 
     Type:String, 
     Value:***** 
    } 
] 
} 

另一種方法可以爲你工作是使用$拉和推$。例如這樣的更換任務(假定tasks.Parameter.Name是唯一的參數數組):

db.test2.update({$and: [{"tasks.Name": "Task3"}, {"tasks.Parameter.Name":"para1"}]}, {$pull: {"tasks.$.Parameter": {"Name": "para1"}}}) 
db.test2.update({"tasks.Name": "Task3"}, {$push: {"tasks.$.Parameter": {"Name": "para3", Type: "String", Value: 1}}}) 

有了這個解決方案,你需要小心對於併發性,因爲將是文檔不存在的短暫時刻。