2012-09-27 24 views
10

mam te dane w Mongo:Aktualizacja element w sub sub tablicy w MongoDB

{ 
    "_id" : ObjectId("505fd43fdbed3dd93f0ae088"), 
    "categoryName" : "Cat 1", 
    "services" : [ 
     { 
      "serviceName" : "Svc 1", 
      "input" : [ 
       { "quantity" : 10, "note" : "quantity = 10" }, 
       { "quantity" : 20, "note" : "quantity = 20" } 
      ] 
     }, 
     { 
      "serviceName" : "Svc 2", 
      "input" : [ 
       { "quantity" : 30, "note" : "quantity = 30" }, 
       { "quantity" : 40, "note" : "quantity = 40" } 
      ] 
     } 
    ] 
} 

Teraz chcę zaktualizować ilość dla "Svc 1":

{ "quantity" : 10, "note" : "quantity = 10" } 

odczuwalna:

{"quantity": 100, "note": "changed to 100"} 

Jak mogę zrobić z Mongo? `

Jak kno w, operator operacyjny obsługuje tylko pierwszą tablicę, ktoś powinien użyć indeksu elementu z sub sub array, ale problem polega na tym, w jaki sposób można poznać ten indeks w czasie wykonywania? (Używam natywnego sterownika C# w MongoDB)

Z góry dziękuję za pomoc!

Johnny

Odpowiedz

10

Skoro masz tablicę w tablicę, nie jest łatwy sposób odwołać zagnieżdżony subarray chyba wiesz pozycję w tablicy, którą chcesz zaktualizować.

Tak więc, na przykład, można zaktualizować pierwsze wejście dla „Svc 1” z C# odpowiednik:

db.services.update(

    // Criteria 
    { 
     '_id' : ObjectId("505fd43fdbed3dd93f0ae088"), 
     'services.serviceName' : 'Svc 1' 
    }, 

    // Updates 
    { 
     $set : { 
      'services.$.input.0.quantity' : 100, 
      'services.$.input.0.note' : 'Quantity updated to 100' 
     } 
    } 
) 

Jeśli nie znać pozycję zagnieżdżonych input tablicy, będzie mieć aby pobrać pasujące services, przerób tablicę input w kodzie aplikacji, a następnie $set zaktualizowaną tablicę.

Alternatywnie, można zmodyfikować zagnieżdżony tablicę używać osadzony dokument zamiast np:

{ 
    "categoryName" : "Cat 1", 
    "services" : [ 
     { 
      "serviceName" : "Svc 1", 
      "input1" : { "quantity" : 10, "note" : "quantity = 10" }, 
      "input2" : { "quantity" : 20, "note" : "quantity = 20" } 
     }, 
    ] 
} 

które można następnie zaktualizować nazwy, np input1:

db.services.update(

    // Criteria 
    { 
     '_id' : ObjectId("5063e80a275c457549de2362"), 
     'services.serviceName' : 'Svc 1' 
    }, 

    // Updates 
    { 
     $set : { 
      'services.$.input1.quantity' : 100, 
      'services.$.input1.note' : 'Quantity updated to 100' 
     } 
    } 
) 
+0

Nie jest pokrewnym żądaniem [SERVER-267] (https://jira.mongodb.org/browse/SERVER-267) (częściowa obsługa symboli wieloznacznych) w narzędziu do śledzenia problemów MongoDB. – Stennie

+0

Dzięki za pomoc, Stennie! Obecnie grupuję macierz danych wejściowych i wyjściowych do innej kolekcji jako obejście tego problemu. – Johnny

5

Ponieważ don” t znać pozycję wartości, którą chcesz zaktualizować, najpierw wstawić nową wartość ze zaktualizowanymi informacjami, a następnie usunąć wartość, którą chcesz zaktualizować.

db.services.update(
    { 
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"), 
    'services.serviceName' : 'Svc 1' 
    }, 
    { 
    { $addToSet: { 'services.$.input' : "new sub-Doc" } 
    } 
) 

a następnie usunąć, gdy wkładka jest sukces

db.services.update(
    { 
    '_id' : ObjectId("505fd43fdbed3dd93f0ae088"), 
    'services.serviceName' : 'Svc 1' 
    }, 
    { 
    { $pull: { 'services.$.input' : { "quantity" : 10, "note" : "quantity = 10" } } 
    } 
) 

Funkcja ta jest przydatna, gdy indeks nie jest znany, a dokument powinien mieć sub-dokumentów mających ten sam klucz jak „wejście” w poście Update an element in sub of sub array in mongodb

+3

To było pomocne. Teraz przełączam się z powrotem do MySql. Dzięki. – JSideris