java - 从 Java 批量导入时覆盖 Azure Cosmos DB 中已存在的项目

标签 java json azure import azure-cosmosdb

我正在使用 Java DocumentDbbulk-executor 将 json 数组批量导入到 Azure Cosmos DB

示例JSON:

[
  {
    "SId": "101",
    "SName": "ABC"
  },
  {
    "SId": "102",
    "SName": "XYZ"
  }
]

示例代码:

(PARTTION_KEY = "\SId")

DocumentCollection collection = Utilities.createEmptyCollectionIfNotExists(client, DATABASE, CONTAINER, PARTITION_KEY, THROUGHPUT);
            ArrayList<String> list = new ArrayList<String>();
            JSONParser jsonParser = new JSONParser();
            FileReader reader = new FileReader("C:\\samplejson.json");



                Object obj = jsonParser.parse(reader);

                JSONArray jsonArray  = (JSONArray) obj;

                if (jsonArray  != null) {
                    int len = jsonArray.size();
                    for (int i=0;i<len;i++){
                        list.add(jsonArray.get(i).toString());
                    }
                }



                client.getConnectionPolicy().getRetryOptions().setMaxRetryWaitTimeInSeconds(30);
                client.getConnectionPolicy().getRetryOptions().setMaxRetryAttemptsOnThrottledRequests(9);



                DocumentBulkExecutor.Builder bulkExecutorBuilder = DocumentBulkExecutor.builder().from(client, DATABASE, CONTAINER,
                collection.getPartitionKey(), 20000);

                DocumentBulkExecutor bulkExecutor = bulkExecutorBuilder.build();

                client.getConnectionPolicy().getRetryOptions().setMaxRetryWaitTimeInSeconds(0);
                client.getConnectionPolicy().getRetryOptions().setMaxRetryAttemptsOnThrottledRequests(0);
                BulkImportResponse bulkImportResponse = bulkExecutor.importAll(list, false, false, null);
                System.out.println(bulkImportResponse.getNumberOfDocumentsImported());

现在,如果我有另一个 JSON:

[
  {
    "SId": "101,         // Item with this SID has already been inserted
    "SName": "ABCDEF"
  },
  {
    "SId": "103",
    "SName": "PQR"
  }
]

我想将此 JSON 插入到同一个容器中。但它只是存储为一个新条目并具有不同的“id”,由 Cosmos DB 自动创建。

如果项目已经存在,如何根据“SId”同时批量导入和覆盖该项目?

请帮忙!

最佳答案

您需要将 importAll 调用中的 isUpsert 标志更改为 true。这将启用 Upsert 操作,这意味着如果 id 尚不存在,它将添加一个新文档,或者如果 id 已存在,它将更新现有文档。

换行:

BulkImportResponse bulkImportResponse = bulkExecutor.importAll(list, false, false, null);

BulkImportResponse bulkImportResponse = bulkExecutor.importAll(list, true, false, null);

https://learn.microsoft.com/en-us/azure/cosmos-db/bulk-executor-java#bulk-import-data-to-azure-cosmos-db

关于java - 从 Java 批量导入时覆盖 Azure Cosmos DB 中已存在的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59542762/

相关文章:

javax.net.ssl.SSLHandshakeException : Remote host closed connection during handshake during web service communicaiton

java - 如何使用 Jackson 正确序列化/反序列化 java.time.DayOfWeek?

javascript - 使用 JSON 初始化 JavaScript 对象

php - 使用 JQuery AJAX 将 JSON 数组保存到 mysql

azure - 如何从 Azure 数据工厂中的 CosmosDb 数据集查询文档属性

azure - 通过Powershell将Function App导入API管理

azure - 由于防火墙的原因,无法从 VM 访问 Azure Blob 存储

java - 从 Java 打印 PDF 文档时,部分文本会旋转

java - hibernate 条件列表后的 Postgresql 无限循环

ajax - 在 URL Hash/Fragment 中存储 JSON 的最佳实践