2010-08-26 85 views
8

假設我有以下的文檔結構:如何更新mongo db中嵌套數組中的對象?

{ 
    "name": "myProduct", 
    "perspectives" : [ 
     { 
      "name": "p1", 
      "views" : [ 
       { 
        "name": "v1" 
       }, 
       { 
        "name": "v2" 
       } 
      ] 
     }, 
     { 
      "name": "p2", 
      "views" : [ 
       { 
        "name": "v1" 
       }, 
       { 
        "name": "v2" 
       } 
      ] 
     } 
    ] 
} 

我怎麼會去更新文檔結構的「別名」字段添加到每個視圖?

基本上我正在尋找類似perspectives.views.alias的東西:「av1」適用於所有perspectives.views.name:「v1」。

所形成的結構是這樣的:

{ 
    "name": "myProduct", 
    "perspectives" : [ 
     { 
      "name": "p1", 
      "views" : [ 
       { 
        "name": "v1", 
        "alias": "av1" 
       }, 
       { 
        "name": "v2", 
        "alias": "av2" 
       } 
      ] 
     }, 
     { 
      "name": "p2", 
      "views" : [ 
       { 
        "name": "v1", 
        "alias": "av1" 
       }, 
       { 
        "name": "v2", 
        "alias": "av2" 
       } 
      ] 
     } 
    ] 
} 

爲了澄清,我想要做這樣的事情:

foreach (view in product.perspectives.views) 
{ 
    if (view.name == "p1") 
     view.add("alias", "av1"); 
} 
+0

難道你不能用你正在使用的任何語言來獲取數據,就像你在底部一樣循環它並更新它?或者你想在單個查詢中做到這一點。如果是這種情況,請查看:http://www.mongodb.org/display/DOCS/Server-side+Code+Execution – 2010-08-26 21:55:41

+0

謝謝Shane!是的,我是從控制檯作爲腳本而不是從應用程序和更高級別的語言(例如Java)來完成它。如果它最終變得更容易/更有效率,我可能會去應用程序路線。 – longda 2010-08-27 17:58:31

回答

15

雖然你的文件你必須循環中,每個文件中的觀點和每個觀點中的觀點。然後更新視圖並保存更新的文檔。像這樣的應該做的伎倆:

db.products.find().forEach(function (product) { 
    product.perspectives.forEach(function (perspective) { 
    perspective.views.forEach(function (view) { 
     view.alias = "a" + view.name; 
    }) 
    }); 

    db.products.save(product); 
}) 

您可以將此功能粘貼到Mongo shell並從那裏運行它。作爲替代方案,可以將其保存在一個名爲updateProducts.js文件,並與蒙戈外殼程序運行該文件:

mongo nameOfDatabase updateProducts.js 

的功能將在服務器上執行,所以它應該是相當快的。

+0

不錯,我會試試看...謝謝! – longda 2010-08-27 17:59:01

+0

這是有效的!你是上帝! :) – longda 2010-08-27 18:05:36

+0

@longda:很高興我可以幫助:) – 2010-08-27 18:32:43