2010-08-26 23 views
8

Aşağıdaki belge yapıya sahip varsayarsak:Nesne dizilerindeki nesne mongo db'de nasıl güncellenir?

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

nasıl görüşlerin her birine bir "ad" alan eklemek için belge yapısını güncelleme hakkında gitmek ?

Temel olarak perspectives.views.alias gibi bir şey yapmak istiyorum: tüm perspectives.views.name için "av1": "v1".

çıkan yapı şu şekilde görünecektir:

{ 
    "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" 
       } 
      ] 
     } 
    ] 
} 

netleştirmek için, ben böyle bir şey yapmak istiyorum: belgeleriniz olsa

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

Verileri, kullandığınız dilde dilediğiniz gibi çekemiyorsunuz, alt kısımda olduğu gibi geçiş yapıp güncelleyemiyor musunuz? Veya bunu tek bir sorguda yapmaya çalışıyorsunuz. Durum buysa, şuna bir bakın: http://www.mongodb.org/display/DOCS/Server-side+Code+Execution –

+0

Teşekkürler Shane! Evet, konsoldan bir uygulama ve daha yüksek düzeyli bir dil (örneğin Java gibi) yerine komut dosyaları olarak yapıyorum. Uygulama yoluna gidebilirim, ancak daha kolay/daha üretken olursak. – longda

cevap

15

Sen döngü gerekecek, Her belgede perspektifler ve her perspektifte görüşler. Ardından, görünümleri güncelleyin ve güncelleştirilmiş belgeyi kaydedin. Sen Mongo kabuk içine bu fonksiyonu yapıştırın ve oradan çalıştırabilirsiniz

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); 
}) 

: Böyle bir şey hile yapmak gerekir. Alternatif olarak, updateProducts.js adlı bir dosyaya kaydedebilir ve Mongo kabuk dosyayı çalıştırın:

mongo nameOfDatabase updateProducts.js 

fonksiyon sunucusunda çalıştırılacaktır, bu yüzden oldukça hızlı olmalıdır.

+0

Güzel, deneyeceğim ... teşekkürler! – longda

+0

Bu işe yarıyor! Sen bir tanesin! :) – longda

+0

@longda: Sevindim Yardımcı olabilirim :) –