我在azure cosmos db中使用分区集合。 我将文档插入到集合中。我尝试使用以下代码删除文档,但它没有被删除。引发以下异常。
internal static bool DeleteDocumentUnderPartition(AzureDocumentDbCollectionKind collectionKind, string partitionKey, string id)
{
var doc = DocumentClient.CreateDocumentQuery(GetCollectionLink(collectionKind), new FeedOptions
{
PartitionKey = new PartitionKey(partitionKey)
}).AsEnumerable().FirstOrDefault(x => x.Id.Equals(id));
DocumentClient.DeleteDocumentAsync(doc.SelfLink);
return true;
}
传递了partitionKey的值:" 4c1429ca58f84e86a3f2e3d9ba1b74de"
id传递的值:" aa20ea966258492792864c3817313b2a"
例外 - >
DocumentClientException:消息:{"错误":["未找到资源"]} ActivityId:96696cde-3ea3-41fb-bc9c-70dfd8cfac36,请求URI: /应用/ 9dee6cc4-be09-426e-B153-f213b908337a /服务/ e61dcc20-86c2-4751-b4b7-53fd686d04ae /分区/ 42db755a-bded-4fe9-bd4c-3561fae0aaa9 /复制/ 131599878429038582s, RequestStats:
ResponseTime:2018-01-18T10:20:07.5146574Z,StoreReadResult: StorePhysicalAddress: rntbd://100.114.47.168:13700 /应用/ 9dee6cc4-be09-426e-B153-f213b908337a /服务/ e61dcc20-86c2-4751-b4b7-53fd686d04ae /分区/ 42db755a-bded-4fe9-bd4c-3561fae0aaa9 /复制/ 131599878429038582s, LSN:177530,GlobalCommittedLsn:177530,PartitionKeyRangeId :, IsValid:True,StatusCode:0,IsGone:False,IsNotFound:True, RequestCharge:1,ItemLSN:-1,ResourceType:Collection, OperationType:读取
ResponseTime:2018-01-18T10:20:07.5146574Z,StoreReadResult: StorePhysicalAddress: rntbd://100.114.45.40:13700 /应用/ 9dee6cc4-be09-426e-B153-f213b908337a /服务/ e61dcc20-86c2-4751-b4b7-53fd686d04ae /分区/ 42db755a-bded-4fe9-bd4c-3561fae0aaa9 /复制/ 131606373510679694s, LSN:177530,GlobalCommittedLsn:177530,PartitionKeyRangeId :, IsValid:True,StatusCode:0,IsGone:False,IsNotFound:True, RequestCharge:1,ItemLSN:-1,ResourceType:Collection, OperationType:读取
但是,从另一个集合(非分区集合)中删除文档对我有用。 任何帮助将不胜感激。
答案 0 :(得分:0)
我尝试使用示例代码重现您的问题,但失败了。
using Microsoft.Azure.Documents;
using Microsoft.Azure.Documents.Client;
using System;
namespace ConsoleApp1
{
class Program
{
private static DocumentClient client;
static void Main(string[] args)
{
client = new DocumentClient(new Uri("***"), "***");
var docUri = UriFactory.CreateDocumentUri("db", "collpart", "1");
var reqOptions = new RequestOptions { PartitionKey = new PartitionKey("1") };
client.DeleteDocumentAsync(docUri, reqOptions).Wait();
//block
Console.ReadLine();
}
}
}
我在分区集合中的文档(id是我的分区键)就像:
我认为分区键可能是问题的关键。您需要提供分区键的值,而不是存储分区键的字段的名称。
如果可以正确删除文档,您可以尝试创建一个简单的新分区集合测试。
希望它对你有所帮助。
更新答案:
我认为你误解了partitionkey
中FeedOptions
属性的含义。
例如,我的容器创建如下:
分区键是" name"我的收藏在这里。您可以检查收藏夹的分区键。
我的文件如下:
{
"id": "1",
"name": "jay"
}
{
"id": "2",
"name": "jay2"
}
我的partitionkey
是&#39; name&#39; ,所以我在这里有两个分区:&#39; jay&#39; 和<强>&#39; jay1&#39; 强>
所以,在这里你应该将partitionkey
属性设置为&#39; jay&#39;或者&#39; jay2&#39;,而不是&#39; name&#39;。
如果您没有设置错误的分区密钥,请分享您的分区密钥设置和要删除的文档的详细信息吗? (请隐藏敏感信息,谢谢)