2013-06-16 8 views

risposta

12

Aggiornamento matrice incorporato comporta fondamentalmente due fasi:

1. Si crea una versione modificata del l'intero array. Esistono più operazioni che è possibile utilizzare per modificare un array e sono elencate qui: http://www.rethinkdb.com/api/#js:document_manipulation-insert_at

Nel tuo esempio, se sai che il documento che desideri aggiornare è il secondo elemento dell'array, devi scrivere qualcosa come

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

per generare il nuovo array. 1 qui è l'indice del secondo elemento, poiché gli indici iniziano con 0. Se non si conosce l'indice, è possibile utilizzare la funzione indexesOf per cercare una voce specifica nell'array. Molte cose stanno accadendo qui: changeAt sostituisce un elemento dell'array. Qui, l'elemento all'indice 1 è sostituito dal risultato di oldArray.nth (1) .merge ({text: "nuovo contenuto"}). In questo valore, per prima cosa selezioniamo l'elemento da cui vogliamo basare il nostro nuovo elemento, usando oldArray.nth (1). Questo ci dà l'oggetto JSON

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

Utilizzando uniamo, possiamo sostituire il campo di testo di questo oggetto dal nuovo valore.

2. Ora che possiamo costruire il nuovo oggetto, dobbiamo ancora memorizzarlo nella riga originale. Per questo, usiamo l'aggiornamento e basta impostare il campo "commenti" sul nuovo array. Possiamo accedere al valore della vecchia matrice nella riga attraverso la variabile re.row di ReQL. Complessivamente, la query avrà il seguente aspetto:

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

La soluzione di Daniel è corretta. Tuttavia, vi sono diverse questioni aperte su Github per miglioramenti previsti, tra cui:

... tra gli altri problemi correlati. Fino a quando non vengono introdotti in ReQL (in particolare # 895), l'approccio di Daniel è corretto.