2015-06-11 28 views
6

Wydaje mi się, że mam problem z dostępem do zawartości tablicy zagnieżdżonej w tablicy w dokumencie mongodb. Nie mam żadnych problemów z dostępem do pierwszej tablicy „grupy” z kwerendy jak poniżej ...MongoDB: aktualizowanie tablicy w tablicy

db.orgs.update({_id: org_id, "groups._id": group_id} , {$set: {"groups.$.name": "new_name"}}); 

Gdzie napotkasz problem jest gdy próbuję zmodyfikować właściwości elementu w tablicy „features” zagnieżdżone tablica "grupa".

Oto czego przykładem dokument wygląda

 { 
     "_id" : "v5y8nggzpja5Pa7YS", 
     "name" : "Example", 
     "display_name" : "EX1", 
     "groups" : [ 
      { 
       "_id" : "s86CbNBdqJnQ5NWaB", 
       "name" : "Group1", 
       "display_name" : "G1", 
       "features" : [ 
        { 
         _id  : "bNQ5Bs8BWqJn6CdNa" 
         type  : "blog", 
         name  : "[blog name]" 
         owner_id : "ga5YgvP5yza7pj8nS" 
        }, 
       ] 
      }, 
     ] 
    }, 

I to jest kwerenda Próbuję użyć.

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "qBX3KDrtMeJGvZWXZ", "groups.features._id":"bNQ5Bs8BWqJn6CdNa" }, {$set: {"groups.$.features.$.name":"New Blog Name"}}); 

Zwraca z komunikatem o błędzie:

WriteResult({ 
    "nMatched" : 0, 
    "nUpserted" : 0, 
    "nModified" : 0, 
    "writeError" : { 
     "code" : 2, 
     "errmsg" : "Too many positional (i.e. '$') elements found in path 'groups.$.features.$.name'" 
    } 
}) 

Wydaje się, że Mongo nie obsługuje modyfikując tablice zagnieżdżone w tablicach za pomocą elementu pozycyjnego?

Czy istnieje sposób modyfikacji tej tablicy bez wyjmowania całej rzeczy, modyfikowania jej, a następnie ponownego wprowadzania? Czy w przypadku takiego zagnieżdżania jak zwykle standardową praktyką jest tworzenie nowej kolekcji? (Nawet jeśli dane są potrzebne tylko wtedy, gdy dane podstawowe są potrzebne) Czy powinienem zmienić strukturę dokumentu, aby druga zagnieżdżona tablica była obiektem i uzyskać do niego dostęp za pomocą klucza? (Jeżeli klucz jest liczbą całkowitą, która może działać jako „_id”)

groups.$.features.[KEY].name 

co jest uważane za „poprawny” sposób to zrobić?

Odpowiedz

3

Po kilku dalszych badaniach wygląda na to, że jedyną metodą modyfikacji tablicy w obrębie tablicy byłoby zastosowanie zewnętrznej logiki w celu znalezienia indeksu elementu, który chcę zmienić. Wykonanie tej czynności wymagałoby każdej zmiany w celu znalezienia zapytania w celu zlokalizowania indeksu, a następnie zapytania o aktualizację w celu zmodyfikowania tablicy. To nie wydaje się najlepszym sposobem.

Link to a 2010 JIRA case requesting multiple positional elements...

Od zawsze będę znać identyfikator funkcji, jakie zdecydowaliśmy się zmienić mój struktury dokumentu.

 { 
    "_id" : "v5y8nggzpja5Pa7YS", 
    "name" : "Example", 
    "display_name" : "EX1", 
    "groups" : [ 
     { 
      "_id" : "s86CbNBdqJnQ5NWaB", 
      "name" : "Group1", 
      "display_name" : "G1", 
      "features" : { 
       "1" : { 
         type  : "blog", 
         name  : "[blog name]" 
         owner_id : "ga5YgvP5yza7pj8nS" 
       }, 
      } 
     }, 
    ] 
}, 

Dzięki nowej strukturze, zmiany mogą być dokonane w następujący sposób:

db.orgs.update({_id: "v5y8nggzpja5Pa7YS", "groups._id": "s86CbNBdqJnQ5NWaB"}, {$set: {"groups.$.features.1.name":"Blog Test 1"}}); 
Powiązane problemy