6

lightcouch APIを使用 して、Javaを介してcouchdbに接続しています。dbclient.save(object)メソッドを使用して単一のドキュメントを保存できます。ただし、私の要件は、一度に大量のドキュメントを保存することです。LightcouchAPIを使用したバルクドキュメントの保存に関連するメソッドが見つかりません。考えられる解決策を提案してください。

前もって感謝します!

4

2 に答える 2

3

やってみることにしました。個人を説明するドキュメントを保持するデータベースがあります。

LightCouchを拡張する私のPersonクラスは次のとおりです。Document

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

この例で注目すべき 2 つの部分について説明します。

まずは資料集めです。この場合List、例では a の代わりに配列を使用しました。

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

List同様にa を使用し、後で Java のユーティリティ メソッドを使用して配列に変換することもできます。

2 つ目はStringEntity. HTTP Bulk Document APIに関するCouchDB のドキュメントによると、単一のリクエストで複数のドキュメントを変更する場合、リクエスト本文の JSON 構造は次のようになります。

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

StringEntityこれがやや醜い定義の理由です。

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

応答として、挿入されたドキュメントの *_id* と *_rev* を表すフィールドとトランザクション ステータス インジケーターを含むオブジェクトを含む JSON 配列を取得します。

于 2012-08-05T08:11:45.237 に答える