我只有一个集合,当我尝试使用下面的代码删除文档时
PartitionKey partitionKey = new PartitionKey("undefined");
RequestOptions requestOptions=new RequestOptions();
requestOptions.setPartitionKey(partitionKey);
for(Document currentDocument: existingIMEIDevice){
try {
ConfigVariables.documentClient.deleteDocument(currentDocument.getSelfLink(), requestOptions);
} catch (DocumentClientException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
它抛出异常。
com.microsoft.azure.documentdb.DocumentClientException:消息:{"错误":["资源未找到"]} ActivityId:4353e7c0-0b24-4b2a-8ec6-fc2db4059aa0,请求URI:/ apps / 708ed403-166f-44e4-847f-ccaa0cd22d9c / services / d1e2ed4d-7e69-4a3d-9575-3e24b96621b4 / partitions / e3fc6138-06a5-4876-a629- a4be69917ded / replicas / 131533416718986721p,StatusCode:NotFound 在com.microsoft.azure.documentdb.internal.ErrorUtils.maybeThrowException(ErrorUtils.java:69) 在com.microsoft.azure.documentdb.internal.GatewayProxy.performDeleteRequest(GatewayProxy.java:187) 在com.microsoft.azure.documentdb.internal.GatewayProxy.doDelete(GatewayProxy.java:99) 在com.microsoft.azure.documentdb.internal.GatewayProxy.processMessage(GatewayProxy.java:332) 在com.microsoft.azure.documentdb.DocumentClient $ 7.apply(DocumentClient.java:2877) 在com.microsoft.azure.documentdb.internal.RetryUtility.executeDocumentClientRequest(RetryUtility.java:58) 在com.microsoft.azure.documentdb.DocumentClient.doDelete(DocumentClient.java:2883) 在com.microsoft.azure.documentdb.DocumentClient.deleteDocument(DocumentClient.java:956) 在com.moveinsync.centraldevices.persistance.AzureCommDAOImpl.replaceDocument(AzureCommDAOImpl.java:45) at com.moveinsync.centraldevices.persistance.AzureCommDAOImpl.documentDbBulkInsert(AzureCommDAOImpl.java:85) 在com.moveinsync.centraldevices.jobs.ToAzureJob.executeInternal(ToAzureJob.java:27) 在org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:75) 在org.quartz.core.JobRunShell.run(JobRunShell.java:202) 在org.quartz.simpl.SimpleThreadPool $ WorkerThread.run(SimpleThreadPool.java:573) 如果我不提供RequestOptions,它会要求我提供分区键。 我没有分区键,因为下面没有返回任何内容
SELECT c.partitionKey FROM c ORDER BY c.partitionKey
我该如何解决这个问题?
答案 0 :(得分:1)
根据我的经验,如果您的集合没有分区键,则在操作数据库时无需为分区键设置查询条件。
在发布时,集合没有分区键,您将分区键设置为RequestOption。因此,数据库肯定不知道在哪里可以找到要运行的文档。
你可以参考我的代码片段:
import com.microsoft.azure.documentdb.*;
public class DeleteDocuments {
private static String accountName="https://jay.documents.azure.com:443/";
private static String accountKey="Czi66skfjZYLTaXuDhoxNb2JHL4DR98VxAxGXtLkWFnjCa5e7gUXQuPgemlXwyPWjjWJpwrseH1wPMfhkqA8cQ==";
private static String databaseName = "db";
private static String collectionName = "coll";
public static void main(String[] args) throws DocumentClientException {
DocumentClient client = new DocumentClient(
accountName,
accountKey
, new ConnectionPolicy(),
ConsistencyLevel.Session);
FeedOptions options = null;
String sql = "select * from c";
FeedResponse<Document> queryResults = client.queryDocuments("dbs/"+databaseName+"/colls/"+collectionName, sql, options);
System.out.println("before delete :");
for (Document d : queryResults.getQueryIterable()) {
System.out.println(String.format("\tRead %s", d));
}
RequestOptions requestOptions = new RequestOptions();
requestOptions.setOfferThroughput(400);
client.deleteDocument("/dbs/"+databaseName+"/colls/"+collectionName+"/docs/1",requestOptions);
queryResults = client.queryDocuments("dbs/"+databaseName+"/colls/"+collectionName, sql, options);
System.out.println("after delete :");
for (Document d : queryResults.getQueryIterable()) {
System.out.println(String.format("\tRead %s", d));
}
}
}
更新答案:
我认为你误解了partitionkey
中options[]
属性的含义。
例如,我的容器创建如下:
此处的分区键是我的收藏品的“名称”。您可以检查集合的分区键。
我的文件如下:
{
"id": "1",
"name": "jay"
}
{
"id": "2",
"name": "jay2"
}
我的partitionkey
'name',所以这里有两个分区:'jay'和'jay1'。
所以,在这里你应该将partitionkey
属性设置为'jay'或'jay2',而不是'name'。
此时,如果我在没有将分区键设置为RequestOptions的情况下运行下面的代码,我将遇到与您相同的问题。
RequestOptions requestOptions = new RequestOptions();
requestOptions.setOfferThroughput(400);
client.deleteDocument("/dbs/"+databaseName+"/colls/"+collectionName+"/docs/1",requestOptions);
线程“main”中的异常java.lang.UnsupportedOperationException: 必须为此操作提供PartitionKey值。在 com.microsoft.azure.documentdb.DocumentClient.addPartitionKeyInformation(DocumentClient.java:3199) 在 com.microsoft.azure.documentdb.DocumentClient.addPartitionKeyInformation(DocumentClient.java:3180) 在 com.microsoft.azure.documentdb.DocumentClient.deleteDocument(DocumentClient.java:959) 在DeleteDocuments.main(DeleteDocuments.java:32)
我需要将分区键参数设置为存储所操作文档的分区。
RequestOptions requestOptions = new RequestOptions();
requestOptions.setOfferThroughput(400);
PartitionKey partitionKey = new PartitionKey("jay");
requestOptions.setPartitionKey(partitionKey);
client.deleteDocument("/dbs/"+databaseName+"/colls/"+collectionName+"/docs/1",requestOptions);
更新答案2:
我想你想要操作没有设置分区键的文件。
请参考这个完美的blog,你会找到答案!
在java代码中,只需将分区键设置为Undefined.Value()
,即可完成所有操作。
RequestOptions requestOptions = new RequestOptions();
requestOptions.setOfferThroughput(400);
PartitionKey partitionKey = new PartitionKey(Undefined.Value());
requestOptions.setPartitionKey(partitionKey);
client.deleteDocument("/dbs/"+databaseName+"/colls/"+collectionName+"/docs/3",requestOptions);
希望它对你有所帮助。