2012-04-27 27 views
6

Tôi đang sử dụng lightcouch API để kết nối với couchdb thông qua Java. Tôi có thể lưu một tài liệu bằng phương thức dbclient.save (object). Tuy nhiên, yêu cầu của tôi là lưu tài liệu hàng loạt cùng một lúc. Tôi không thể tìm thấy bất kỳ phương pháp nào liên quan đến việc lưu tài liệu hàng loạt bằng cách sử dụng api Lightcouch. Xin vui lòng đề nghị bất kỳ giải pháp có thể.Cách lưu tài liệu hàng loạt trong couchdb bằng cách sử dụng lightcouch api trong java

Cảm ơn trước!

+0

Tiết kiệm hàng loạt không được hỗ trợ trong API LightCouch, tuy nhiên nó được lên kế hoạch trong bản phát hành tiếp theo. – ahmedyha

+0

nếu đó là một stopper hiển thị, bạn có thể thực hiện cuộc gọi sử dụng một cái gì đó như Apache Httpclient và Jackson để thực hiện cuộc gọi số lượng lớn của bạn để đi văng – skipy

Trả lời

3

Tôi quyết định từ bỏ. Tôi có một cơ sở dữ liệu chứa các tài liệu mô tả một người.

Đây là lớp học của tôi Person kéo dài 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 

} 

Thuật toán là đơn giản.

  1. Tạo một mảng kiểu Document
  2. Đặt tài liệu của bạn thành các mảng
  3. Tạo một yêu cầu HTTP POST
  4. Đặt JSON quy đổi mảng vào cơ thể yêu cầu
  5. Gửi nó

Đây gần như là mã trông như thế nào.

Lưu ý: try/catch bị bỏ qua cho ngắn gọn! Tất nhiên bạn được dự kiến ​​sẽ sử dụng chúng.

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

Tôi sẽ mô tả hai phần đáng chú ý trong ví dụ này.

Đầu tiên là tập hợp các tài liệu. Trong trường hợp này tôi sử dụng một mảng thay vì một ví dụ.

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

Bạn cũng có thể sử dụng List và sau đó chuyển đổi nó thành mảng bằng cách sử dụng các phương pháp tiện ích của Java.

Thứ hai là StringEntity. Theo tài liệu của CouchDB trên HTTP Bulk Document API về sửa đổi nhiều tài liệu với một yêu cầu duy nhất cấu trúc JSON của phần thân yêu cầu của bạn sẽ trông như thế này.

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

Đây là lý do cho định nghĩa hơi xấu xí StringEntity.

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

Như một phản ứng bạn sẽ nhận được một mảng JSON chứa các đối tượng có trường đại diện cho * _id * và * _rev * của tài liệu được chèn cùng với chỉ báo trạng thái giao dịch.

+1

+1 để viết một bài luận. –

0

Tôi đã làm điều tương tự nhưng với phần còn lại mùa xuân Mẫu Tôi đã tạo một lớp học sẽ giữ tài liệu được cập nhật int theo cách sau.

public class BulkUpdateDocument { 

    private List<Object> docs; 
    }  

Mã Rest của tôi trông như thế này.

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); 
Các vấn đề liên quan