2013-06-16 14 views

Odpowiedz

12

Aktualizacja wbudowanego tablica w zasadzie składa się z dwóch etapów:

1. utworzyć zmodyfikowaną wersję całej tablicy. Istnieje wiele operacji, których można użyć do modyfikowania tablicy, i są one wymienione tutaj: http://www.rethinkdb.com/api/#js:document_manipulation-insert_at

W twoim przykładzie, jeśli wiesz, że dokument, który chcesz zaktualizować, jest drugim elementem tablicy, możesz napisać coś w rodzaju

oldArray.changeAt(1, oldArray.nth(1).merge({text: "new content"})) 

wygenerować nową tablicę. 1 tutaj jest indeks drugiego elementu, ponieważ indeksy zaczynają się od 0. Jeśli nie znasz indeksu, możesz użyć funkcji indexesOf do wyszukania konkretnego wpisu w tablicy. Tutaj dzieje się wiele rzeczy: changeAt zastępuje element tablicy. Tutaj element w indeksie 1 zostaje zamieniony na wynik oldArray.nth (1) .merge ({text: "new content"}). W tej wartości najpierw wybieramy element, z którego chcemy oprzeć nasz nowy element, używając oldArray.nth (1). To daje nam obiekt JSON

{ 
    "author": "Adder K.", 
    "text": "old content" 
} 

Korzystając scalania, możemy zastąpić pola tekstowego tego obiektu przez nową wartość.

2. Teraz, kiedy możemy zbudować nowy obiekt, musimy go przechowywać w oryginalnym wierszu. W tym celu korzystamy z aktualizacji i po prostu ustawiamy pole "komentarze" na nową tablicę. Możemy uzyskać dostęp do wartości starej tablicy w wierszu za pośrednictwem zmiennej r.row ReQL. Ogólnie zapytanie będzie wyglądać następująco:

r.table(...).get(...).update({ 
    comments: r.row('comments').changeAt(1, 
     r.row('comments').nth(1).merge({text: "new content"})) 
    }).run(conn, callback) 
1

Rozwiązanie Daniela jest poprawne. Jednakże, istnieje kilka otwarte kwestie dotyczące Github dla planowanych ulepszeń, w tym:

... wśród innych powiązanych zagadnień. Dopóki nie zostaną wprowadzone do ReQL (szczególnie # 895), podejście Daniela jest poprawne.

Powiązane problemy