2013-07-02 13 views
5

Quindi, ad esempio, ho creato alcuni record/documenti sotto un bucket e l'utente aggiorna solo una colonna su 10 nell'RDBMS, quindi sto provando per inviare solo i dati di una colonna e aggiornarlo in couchbase. Ma il problema è che couchbase sta sovrascrivendo l'intero record e mettendo NULL per il resto delle colonne.Come mantenere i dati esistenti nella base del divano e aggiornare solo i nuovi dati senza sovrascrivere

Un approccio consiste nel copiare tutti i dati dal record esistente dopo averlo recuperato da Cbase e quindi sovrascrivere la nuova colonna durante la copia dei dati da quella precedente. Ma questo non sembra un approccio ottimale

Qualche suggerimento?

+0

Ecco come funziona Couchbase/CouchDB. Ogni documento deve essere scritto nel suo complesso. non puoi scrivere singole parti. – WiredPrairie

risposta

0

Se si utilizzano dati strutturati (json), è necessario leggere il record esistente, quindi aggiornare il campo desiderato nella struttura dati del programma e quindi inviare nuovamente il record. Non è possibile aggiornare singoli campi nella struttura di JSON senza inviarli nuovamente. Non c'è un modo per aggirare questo che io sappia.

0

È vero, per aggiornare singoli elementi in un documento JSON, è necessario recuperare l'intero documento e sovrascriverlo.

Stiamo lavorando per aggiungere singoli aggiornamenti degli articoli nel prossimo futuro.

+1

è stato ancora implementato un nuovo aggiornamento per le singole voci? – ChickenWing24

3

È possibile utilizzare l'aggiornamento N1QL Stat. Google per Couchbase N1QL UPDATE sostituisce un documento già esistente con valori aggiornati.

aggiornamento:

UPDATE keyspace-ref [use-keys-clause] [set-clause] [unset-clause] [where-clause] [limit-clause] [returning-clause] 

set-clausola:

SET path = expression [update-for] [ , path = expression [update-for] ]* 

aggiornamento-per:

FOR variable (IN | WITHIN) path (, variable (IN | WITHIN) path)* [WHEN condition ] END 

disinserito-clausola:

UNSET path [update-for] (, path [ update-for ])* 
keyspace-ref: Specifies the keyspace for which to update the document. 

È possibile aggiungere uno spazio dei nomi-nome facoltativo per lo spazio delle chiavi-nome in questo modo:

namespace-name:keyspace-name. 

-usare i tasti-clausola: Specifica le chiavi degli elementi di dati da aggiornare. Opzionale. Le chiavi possono essere qualsiasi espressione.

set-clause: specifica il valore per un attributo da modificare.

unset-clause: rimuove l'attributo specificato dal documento.

aggiornamento-per: l'aggiornamento per clausola utilizza l'istruzione FOR per iterare su un array nidificato e SET o UNSET l'attributo specificato per ogni elemento corrispondente nell'array.

where-clause: specifica la condizione che deve essere soddisfatta affinché i dati vengano aggiornati. Opzionale.

limit-clause: specifica il numero massimo di oggetti che è possibile aggiornare. Questa clausola deve avere un numero intero non negativo come limite superiore. Opzionale.

restituzione-clausola: restituisce i dati aggiornati come specificato in result_expression.

privilegi RBAC

utente di eseguire l'istruzione UPDATE deve avere il privilegio query di aggiornamento sul keyspace bersaglio. Se l'istruzione contiene clausole che richiedono la lettura dei dati, come la clausola SELECT o la clausola RETURNING, allora è richiesto anche il privilegio Query Select sugli spazi delle chiavi indicati nelle rispettive clausole. Per ulteriori dettagli sui ruoli utente, vedere Autorizzazione.

Per esempio,

Per eseguire la seguente dichiarazione, l'utente deve avere il privilegio query di aggiornamento sulla travel-sample.

UPDATE `travel-sample` SET foo = 5 

Per eseguire la seguente dichiarazione, l'utente deve avere il privilegio query di aggiornamento sulla travel-sample e Query Select privilegio beer-sample.

UPDATE `travel-sample` 
SET foo = 9 
WHERE city = (SELECT raw city FROM `beer-sample` WHERE type = "brewery" 
To execute the following statement, user must have the Query Update privilege on `travel-sample` and Query Select privilege on `travel-sample`. 

UPDATE `travel-sample` 
SET city = “San Francisco” 
WHERE lower(city) = "sanfrancisco" 
RETURNING * 
Example 

La seguente dichiarazione cambia il "tipo" del prodotto, "Odwalla-juice1" a "prodotto-succo".

UPDATE product USE KEYS "odwalla-juice1" SET type = "product-juice" RETURNING product.type 

"results": [ 
     { 
      "type": "product-juice" 
     } 
    ] 

Questa affermazione rimuove l'attributo "tipo" dallo spazio delle chiavi "prodotto" per il documento con il tasto "Odwalla-juice1".

UPDATE product USE KEYS "odwalla-juice1" UNSET type RETURNING product.* 

"results": [ 
     { 
      "productId": "odwalla-juice1", 
      "unitPrice": 5.4 
     } 
    ] 

Questa dichiarazione vengono annullati l'attributo "di genere" nella matrice "bambini" per il documento con la chiave, "Dave" nella spazio delle chiavi tutorial.

UPDATE tutorial t USE KEYS "dave" UNSET c.gender FOR c IN children END RETURNING t 

"results": [ 
     { 
      "t": { 
       "age": 46, 
       "children": [ 
        { 
         "age": 17, 
         "fname": "Aiden" 
        }, 
        { 
         "age": 2, 
         "fname": "Bill" 
        } 
       ], 
       "email": "[email protected]", 
       "fname": "Dave", 
       "hobbies": [ 
        "golf", 
        "surfing" 
       ], 
       "lname": "Smith", 
       "relation": "friend", 
       "title": "Mr.", 
       "type": "contact" 
      } 
     } 
    ] 

A partire dalla versione 4.5.1, l'istruzione UPDATE è stata migliorata per impostare gli elementi di nidificazione nidificati. La clausola FOR viene migliorata per valutare funzioni ed espressioni e la nuova sintassi supporta più espressioni nidificate FOR per accedere e aggiornare i campi negli array nidificati. Ulteriori livelli di array sono supportati concatenando le clausole FOR.

Esempio

UPDATE default 
    SET i.subitems = (ARRAY OBJECT_ADD(s, 'new', 'new_value') 
     FOR s IN i.subitems END) 
      FOR s IN ARRAY_FLATTEN(ARRAY i.subitems 
       FOR i IN items END, 1) END; 
Problemi correlati