2012-04-27 20 views
6

Sto utilizzando il lightcouch API per connettersi a couchdb tramite Java. Sono in grado di salvare un singolo documento utilizzando il metodo dbclient.save (oggetto). Tuttavia, il mio requisito è quello di salvare i documenti alla rinfusa alla volta. Non sono in grado di trovare alcun metodo correlato al salvataggio di documenti in blocco utilizzando l'API di Lightcouch. Si prega di suggerire qualsiasi possibile soluzione.Come salvare i documenti collettivi in ​​couchdb utilizzando lightcouch api in java

Grazie in anticipo!

+0

Il salvataggio di massa non è supportato nell'API LightCouch, tuttavia è previsto nella prossima versione. – ahmedyha

+0

se si tratta di uno show stopper è possibile effettuare una chiamata utilizzare qualcosa come Apache Httpclient e Jackson per rendere la vostra chiamata di massa al divano – skipy

risposta

3

Ho deciso di provarlo. Ho un database contenente documenti che descrivono una persona.

Qui è la mia classe Person che si estende DocumentLightCouch:

public class Person extends Document { 

    private String firstname = ""; 
    private String lastname = ""; 
    private int age = -1; 

    public Person(String firstname, String lastname, int age) { 
     super(); 
     this.setFirstname(firstname); 
     this.setLastname(lastname); 
     this.setAge(age); 
    } 

    // setters and getters omitted for brevity 

} 

L'algoritmo è semplice.

  1. Creare un array di tipo Document
  2. Mettere i documenti nella matrice
  3. Creare una richiesta HTTP POST
  4. Mettere il JSON convertito array in corpo della richiesta
  5. Inviatela

Ecco approssimativamente come potrebbe apparire il codice.

Nota: try/catch omesso per brevità! Ovviamente ci si aspetta che li usi.

public static void main(String[] args) { 

    // You could also use a List and then convert it to an array 
    Document[] docs = new Document[2]; 
    docs[0] = new Person("John", "Smith", 34); 
    docs[1] = new Person("Jane", "Smith", 30); 

    DefaultHttpClient httpClient = new DefaultHttpClient(); 

    // Note the _bulk_docs 
    HttpPost post = new HttpPost("http://127.0.0.1:5984/persons/_bulk_docs"); 

    Gson gson = new Gson(); 
    StringEntity data = 
     new StringEntity("{ \"docs\": " + gson.toJson(docs) + "}"); 
    data.setContentType("application/json"); 
    post.setEntity(data); 

    HttpResponse response = httpClient.execute(post); 

    if (response.getStatusLine().getStatusCode() != 201) { 
     throw new RuntimeException("Failed. HTTP error code: " 
      + response.getStatusLine().getStatusCode()); 
    } 
    BufferedReader br = new BufferedReader(
     new InputStreamReader((response.getEntity().getContent()))); 
    String output; 
    while ((output = br.readLine()) != null) { 
     System.out.println(output); 
    } 
    httpClient.getConnectionManager().shutdown(); 
} 

descriverò le due parti degne di nota in questo esempio.

Il primo è la raccolta di documenti. In questo caso ho usato un array invece di un List per l'esempio.

Document[] docs = new Document[2]; 
docs[0] = new Person("John", "Smith", 34); 
docs[1] = new Person("Jane", "Smith", 30); 

È possibile utilizzare un List come bene e poi convertirlo in un array usando metodi di utilità di Java.

Il secondo è lo StringEntity. Secondo la documentazione di CouchDB su HTTP Bulk Document API per modificare più documenti con una singola richiesta, la struttura JSON del corpo della richiesta dovrebbe apparire come questa.

{ 
    "docs": [ 
    DOCUMENT, 
    DOCUMENT, 
    DOCUMENT 
    ] 
} 

Questa è la ragione per la definizione un po 'brutta di StringEntity.

StringEntity data = new StringEntity("{ \"docs\": " + gson.toJson(docs) + "}"); 

Come risposta si otterrà una matrice JSON contenente oggetti i cui campi rappresentare l'* _id * e * * _rev del documento inserito insieme a un indicatore di stato della transazione.

+1

+1 per scrivere un tema. –

0

Ho fatto la stessa cosa ma con la molla Rest Template Ho creato una classe che avrebbe tenuto i documenti da aggiornare nel modo seguente.

public class BulkUpdateDocument { 

    private List<Object> docs; 
    }  

Il mio codice Rest è simile a questo.

BulkUpdateDocument doc = new BulkUpdateDocument(ListOfObjects); 

    Gson gson = new Gson(); 
    RestTemplate restTemplate = new RestTemplate(); 

    HttpHeaders header = new HttpHeaders(); 
    header.setContentType(MediaType.APPLICATION_JSON_UTF8); 
    HttpEntity<?> requestObject = new HttpEntity<Object>(gson.toJson(doc), header); 

    ResponseEntity<Object> postForEntity = restTemplate.postForEntity(path + "/_bulk_docs", requestObject, Object.class); 
Problemi correlati