2012-04-27 40 views
6

我使用lightcouch API連接通過Java來保存的CouchDB CouchDB中批量文件。我可以使用dbclient.save(object)方法保存單個文檔。但是,我的要求是一次保存批量文檔。我無法找到任何與使用Lightcouch api保存批量文檔相關的方法。請提出任何可能的解決方案如何使用lightcouch API在Java中

在此先感謝!

+0

保存批量在LightCouch API中不受支持,但是它計劃在下一版本中使用。 – ahmedyha 2012-05-05 18:12:39

+0

如果這是一個顯示塞,你可以撥打電話使用類似Apache Httpclient和Jackson的電話,使你的批量電話撥打沙發 – skipy 2012-06-24 08:13:53

回答

3

我決定搏一搏。我有一個數據庫來存放描述一個人的文檔。

這裏是我Person類延伸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 

} 

該算法簡單。

  1. 創建類型Document
  2. 的陣列把你的文件導入陣列
  3. 創建一個HTTP POST請求
  4. 把JSON轉換的陣列到請求主體
  5. 發送它

下面大概是代碼的樣子。

注:try/catch語句不再贅述!當然,你有望使用它們。

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

我將描述在這個例子中,兩個值得注意的部分。

第一個是文件的集合。在這種情況下,我使用了一個數組而不是List作爲示例。

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

你可以使用一個List以及後來使用Java的實用方法將其轉換爲一個數組。

第二個是StringEntity。根據CouchDB有關HTTP Bulk Document API上關於使用單個請求修改多個文檔的文檔,請求主體的JSON結構應該如下所示。

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

這就是有點難看StringEntity定義的原因。

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

正如你將獲得一個包含對象,其字段代表* _id *和插入的文件進行的交易狀態指示燈沿* _rev * JSON數組的響應。

+1

+1撰寫論文。 – 2012-08-05 08:33:07

0

我也做了同樣的事情,但有彈簧安置模板 我創建了將持有的文件下面的方式,他被更新INT一類。

public class BulkUpdateDocument { 

    private List<Object> docs; 
    }  

我的休息代碼看起來像這樣。

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