代码之家  ›  专栏  ›  技术社区  ›  Private

Marklogic DMSDK转换模块?

  •  0
  • Private  · 技术社区  · 6 年前

    用例: 我想在db中获取文档的所有内容,并将其存储在一个zip文件中。

    我用了 ml-java-util 将内容转换为zip文件。我的服务器端转换模块逻辑如下:

    1. 我查看了每个文档,并使用节点Xpath只提取了必需的字段。
    2. 但当我执行时,它在我打开时创建了一个zip文件,它有一组基于Uri名称和提取内容的文件。它不是将所有文件内容合并为一个,而是为每个URI创建新文件。

    我怎样才能推翻这种行为?我希望所有文档中的所有内容(即提取的值)都位于一个文件中,该文件也转换为zip。

    已尝试应用 For 循环,但认为它没有任何用处,因为函数本身一个接一个地获取uri(即context.uri)。

    非常感谢您的帮助。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Vivek Siddharthan    6 年前

    您可以使用 ExportToWriterListener ! ExportToWriterListener导出QueryBatcher检索到的所有内容并写入文件。

    DatabaseClient client = DatabaseClientFactory.newClient("localhost", 8012,
        new DatabaseClientFactory.DigestAuthContext("admin", "admin"));
    DataMovementManager moveMgr = client.newDataMovementManager();
    ServerTransform transform = new ServerTransform("transformName");
    File outputFile = new File("output.txt"); // pass in your file here
    String collection = "customers";
    StructuredQueryDefinition query = new  StructuredQueryBuilder().collection(collection); // Substitute your query here
    try (FileWriter writer = new FileWriter(outputFile)) {
      ExportToWriterListener exportListener = new ExportToWriterListener(writer)
        .withRecordSuffix("\n")
        .withTransform(transform) // pass in your Server Transform here
        .onGenerateOutput(
          record -> {
            String contents = record.getContentAs(String.class); 
            return contents; // return the content as it is which is the server transformed documents' content
          }
        );
    
      QueryBatcher queryJob =
        moveMgr.newQueryBatcher(query)
          .withThreadCount(5)
          .withBatchSize(10)
          .onUrisReady(exportListener)
          .onQueryFailure( throwable -> throwable.printStackTrace() );
      moveMgr.startJob( queryJob );
      queryJob.awaitCompletion();
      moveMgr.stopJob(queryJob);
    }
    

    然后您可以创建文件的zip。