我使用lightcouch API連接通過Java來保存的CouchDB CouchDB中批量文件。我可以使用dbclient.save(object)方法保存單個文檔。但是,我的要求是一次保存批量文檔。我無法找到任何與使用Lightcouch api保存批量文檔相關的方法。請提出任何可能的解決方案如何使用lightcouch API在Java中
在此先感謝!
我使用lightcouch API連接通過Java來保存的CouchDB CouchDB中批量文件。我可以使用dbclient.save(object)方法保存單個文檔。但是,我的要求是一次保存批量文檔。我無法找到任何與使用Lightcouch api保存批量文檔相關的方法。請提出任何可能的解決方案如何使用lightcouch API在Java中
在此先感謝!
我決定搏一搏。我有一個數據庫來存放描述一個人的文檔。
這裏是我Person
類延伸Document
LightCouch:
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
}
該算法簡單。
Document
下面大概是代碼的樣子。
注: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撰寫論文。 – 2012-08-05 08:33:07
我也做了同樣的事情,但有彈簧安置模板 我創建了將持有的文件下面的方式,他被更新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);
保存批量在LightCouch API中不受支持,但是它計劃在下一版本中使用。 – ahmedyha 2012-05-05 18:12:39
如果這是一個顯示塞,你可以撥打電話使用類似Apache Httpclient和Jackson的電話,使你的批量電話撥打沙發 – skipy 2012-06-24 08:13:53