我正在使用 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);
关于java - 从 Java 批量导入时覆盖 Azure Cosmos DB 中已存在的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59542762/