2010-08-26 11 views
8

Unter der Annahme, ich folgende Dokumentstruktur haben:Wie aktualisiert man Objekt in verschachtelten Arrays in Mongo db?

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

Wie würde ich über die Aktualisierung der Dokumentstruktur gehen, um ein „alias“ Feld zu jeder der Ansichten hinzufügen?

Grundsätzlich suche ich etwas wie perspectives.views.alias: "av1" für alle perspectives.views.name: "v1".

Die resultierende Struktur würde wie folgt aussehen:

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

Um zu klären, würde Ich mag so etwas tun:

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

Können Sie die Daten nicht mit der von Ihnen verwendeten Sprache abrufen, durchlaufen Sie sie wie am unteren Rand und aktualisieren Sie sie? Oder versuchen Sie es in einer einzigen Abfrage zu tun? Wenn dies der Fall ist, sieh dir das an: http://www.mongodb.org/display/DOCS/Server-side+Code+Execution –

+0

Danke Shane! Ja, ich mache es von der Konsole als Skripte und nicht von einer App und höheren Sprache (wie zum Beispiel Java). Ich könnte jedoch die App Route gehen, wenn es einfacher/produktiver ist. – longda

Antwort

15

Sie Schleife haben werden, obwohl Ihre Dokumente, die Perspektiven in jedem Dokument und die Ansichten in jeder Perspektive. Aktualisieren Sie dann die Ansichten und speichern Sie das aktualisierte Dokument. So etwas sollte den Trick erfüllen:

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

Sie können diese Funktion in die Mongo-Shell einfügen und von dort aus ausführen. Als Alternative, können Sie es in einer Datei updateProducts.js und führen Sie die Datei mit dem Shell Mongo genannt sparen:

mongo nameOfDatabase updateProducts.js 

Die Funktion auf dem Server ausgeführt werden, so sollte es ziemlich schnell sein.

+0

Schön, ich werde es versuchen ... danke! – longda

+0

Das funktioniert! Du bist ein Gott! :) – longda

+0

@longda: Froh kann ich helfen :) –