2011-08-08 5 views
10

Secondo lo CouchDB Wiki on PUT operations.Bulk aggiornando un database CouchDB senza un valore _rev per documento?

Per aggiornare un documento esistente, si invia anche una richiesta PUT. In questo caso, il corpo JSON deve contenere una proprietà _rev, che consente a CouchDB di sapere su quale revisione sono basate le modifiche. Se la revisione del documento attualmente memorizzato nel database non corrisponde, viene restituito un errore di conflitto 409.

Il mio obiettivo è quello di eseguire un bulk_docs aggiornare:

curl -X POST [domain]/[couch db name]/_bulk_docs -H "Content-type: application/json" -d @[some document].json 

mio flusso di lavoro è simile a questo:

  1. miei dati è in un foglio di calcolo di Google Docs.
  2. ho convertire i dati del foglio di calcolo per JSON da copiare e incollare nella Mr. Data Converter
  3. uso Curl (come esposizione qui sopra) per aggiungere documenti/aggiornamento

Il problema è che la prima volta aggiungo nuovi documenti, tutto funziona perfettamente, tuttavia la prossima volta che invio gli stessi documenti, ottengo il seguente errore per ogni documento:

... {"id": "28", "errore": "conflitto", "motivo ":" Conflitto di aggiornamento del documento. "} ...

C'è un modo per aggiornare un documento esistente senza includere una proprietà _rev ?

risposta

18

In base alla progettazione, non è possibile aggiornare un documento CouchDB alla cieca, è possibile solo tentare di aggiornare una revisione specifica di un documento.

Per un singolo documento, è possibile utilizzare uno CouchDB update handler per nascondere questo dal client come un gestore di aggiornamento verrà passato il documento esistente (se esiste) compresa la sua revisione.

Per una raccolta di documenti, quando si utilizza _bulk_docs, è possibile aggiungere "new_edits": false che sarà forzatamente inserire i conflitti invece di rifiuto (anche se avrete ancora bisogno di superare un _rev, semplicemente non deve essere la corrente uno).

Detto questo, sarebbe meglio seguire le regole. Afferra la revisione corrente del documento che desideri aggiornare, prova ad aggiornarlo, se ottieni un 409, ottieni la nuova versione, unisci come appropriato e aggiorna nuovamente.

+0

Il gestore di aggiornamento sembra essere la soluzione ideale per l'aggiornamento dei dati. Sarà più veloce perché non devi scaricare tutti i documenti, unirli lato client e caricarli di nuovo. Invece il gestore dell'aggiornamento può fare la fusione per te con 1/3 delle attività di rete! –

+0

@DobesVandermeer che non è universale. Poiché il gestore aggiornamenti non supporta le operazioni batch, questa è una richiesta per aggiornamento/persist. Se devi eseguire più di 2-4 di essi contemporaneamente, esegui operazioni batch perché in genere richiedono 2-4 richieste, a seconda delle circostanze, ad esempio per l'aggiornamento di 10 documenti. Ovviamente se usi '" new_edits ": false' puoi eseguire il batch persistere/sostituire in una richiesta, ma sappi che' new_edits' è [destinato a essere usato dal replicatore] (http://goo.gl/EFFofn)).Uno svantaggio è che non conserva la cronologia delle revisioni, mi chiedo se questo potrebbe interferire con la replica ... –

+0

@DominykasMostauskis ah sì, buon punto. L'OP potrebbe voler eseguire un download batch, calcolare i nuovi valori e caricare in batch, con un numero inferiore di transazioni complessive. Finché tutto si adatta alla memoria. –

Problemi correlati