azure 必须使用DocumentClient在CosmosDB删除操作中为此操作提供PartitionKey值

t5fffqht  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(101)

我正在尝试从Azure函数的Cosmos DB数据库容器中删除一个项目。但是我得到这个错误**必须为这个操作提供PartitionKey值。**我也研究了this,但没有从中得到任何运气。
下面是我的代码-

public class Item{
    public Item(){}
    public string id {get; set;}
}

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    DocumentClient client = new DocumentClient(new Uri("https://***.documents.azure.com:443/"), Environment.GetEnvironmentVariable("key"));

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    var updated = JsonConvert.DeserializeObject<Item>(requestBody);
    
    var option = new FeedOptions { EnableCrossPartitionQuery = true };
    var collectionUri = UriFactory.CreateDocumentCollectionUri("Test_DB", "Test_Table");
  
    var document = client.CreateDocumentQuery(collectionUri, option).Where(t => t.Id == updated.id)
        .AsEnumerable().FirstOrDefault();

    log.LogInformation("Total Incentive : " + document.GetPropertyValue<string>("id"));

    if (document == null)
    {
        return new NotFoundResult();
    }

    log.LogInformation("Total Incentive : " + document.SelfLink);
    log.LogInformation("Total Incentive : " + document.Id);

    await client.DeleteDocumentAsync(document.SelfLink);
  
    //await client.ReplaceDocumentAsync(document);

    return new OkObjectResult("Deleted");
}

字符串
在google搜索之后,我意识到我需要提供一个分区键值作为**DeleteDocumentAsync()**的第二个参数,如下所示。但是我正在解决如何将分区键值提供给该函数。

await client.DeleteDocumentAsync(document.SelfLink,
  new Requestoptions
  {
    PartitionKey = new Microsoft.Azure.Documents.PartitionKey("33333")
  }
)

**DB名称:**Test_DB
**表名:**Test_Table
分区键:/testCategory

我试图删除的Test_Table的一个示例元素是:

{
    "id": "3f614t4e-q85f-4357-8393-a0b3542db4e1",
    "Email": "testuser@test.com",
    "Name": "Test User",
    "_rid": "XNMBANxVc8oIAAAAAAAAAA==",
    "_self": "dbs/XNMOXA==/colls/TNMNANyVc9o=/docs/XNMBANxVc8oIZZAAAAAAPP==/",
    "_etag": "\"450031d4-0000-0300-0000-60cb36470000\"",
    "_attachments": "attachments/",
    "_ts": 1623930439
}


谁能帮我把分区键放在azure函数代码中?或者如何调整数据库的表?
先谢了。

vyu0f0g1

vyu0f0g11#

正如注解中提到的,当文档中没有指定分区键时,可以使用Microsoft.Azure.Documents.PartitionKey.None作为删除和更新的分区键值。
在Cosmos DB中,当您创建文档时,每个文档都必须为分区键属性指定一个值(在本例中为testCategory)。但是,如果您不指定值,Cosmos DB不会抱怨。它只是将这些文档放在一个特殊的分区中,可以通过在需要的方法中指定Microsoft.Azure.Documents.PartitionKey.None来访问该分区。

sbdsn5lh

sbdsn5lh2#

await _client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(_databaseId, CollectionId, id), new RequestOptions { PartitionKey = new PartitionKey(Undefined.Value) });

字符串

相关问题