2012-04-27 20 views
6

Używam lightcouch API do łączenia się z couchdb przez Javę. Jestem w stanie zapisać pojedynczy dokument przy użyciu metody dbclient.save (object). Jednak moim wymaganiem jest jednoczesne zapisywanie dużych ilości dokumentów. Nie mogę znaleźć żadnych metod związanych z zapisywaniem masowych dokumentów za pomocą api Lightcouch. Proszę zasugerować ewentualne rozwiązanie.Jak zapisywać masowe dokumenty w couchdb przy użyciu api lightcouch w java

Z góry dziękuję!

+0

Zapisywanie zbiorcze nie jest obsługiwane w interfejsie API LightCouch, ale jest planowane w następnym wydaniu. – ahmedyha

+0

jeśli jest to korek, możesz zadzwonić za pomocą czegoś takiego jak Apache Httpclient i Jackson, aby sprawić, że twoje zbiorowe połączenie z kanapą – skipy

Odpowiedz

3

Postanowiłem spróbować. Posiadam bazę danych przechowującą dokumenty opisujące daną osobę.

Oto moja Person klasa, która rozciąga 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 

} 

Algorytm jest prosty.

  1. Utwórz tablicę typu Document
  2. Umieść swoje dokumenty do tablicy
  3. Tworzenie żądania HTTP POST
  4. umieścić JSON konwertowane tablicę do treści żądania
  5. wysłać go

Z grubsza wygląda to, jak kod mógłby wyglądać.

Uwaga: try/catch pominięto dla zwięzłości! Oczywiście należy ich używać.

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(); 
} 

Opiszę dwie części godne uwagi w tym przykładzie.

Pierwsza to zbiór dokumentów. W tym przypadku użyłem tablicy zamiast na przykład List.

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

Można użyć List jak również i później przekonwertować je do tablicy przy użyciu metod użytkowych Java.

Drugi to StringEntity. Zgodnie z dokumentacją CouchDB na HTTP Bulk Document API w sprawie modyfikowania wielu dokumentów za pomocą jednego żądania struktura JSON w treści żądania powinna wyglądać następująco.

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

To jest powód, dla nieco brzydki StringEntity definicji.

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

W odpowiedzi otrzymasz tablicę JSON zawierającą obiekty, których pola reprezentują * _id * i * _rev * włożonego dokumentu wraz ze wskaźnikiem stanu transakcji.

+1

+1 za napisanie eseju. –

0

Zrobiłem to samo, ale z szablonem odpoczynku wiosennego Stworzyłem klasę, która przechowywałaby dokumenty do aktualizacji w następujący sposób.

public class BulkUpdateDocument { 

    private List<Object> docs; 
    }  

Mój kod odpoczynku wygląda następująco.

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); 
Powiązane problemy