插入文档时响应状态代码未指示成功

时间:2020-07-08 14:46:10

标签: azure-cosmosdb azure-cosmosdb-sqlapi

我的容器上有以下分区ID: / vesselId

我正在尝试添加此对象的集合:

public class CoachVessel
{
    [JsonProperty("id")]
    public string vesselId { get; set; }

    [JsonProperty("imo")]
    public long Imo { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

这是我用于批量插入文档的代码:

 CosmosClientOptions options = new CosmosClientOptions() { AllowBulkExecution = true };
 CosmosClient cosmosclient = new CosmosClient(connStr, options);
 Container container = cosmosclient.GetContainer("CoachAPI", "Vessels");
    
 List<Task> concurrentTasks = new List<Task>();
 foreach (var vessel in vessels.Take(1))
 {
     concurrentTasks.Add(container.CreateItemAsync(vessel, new PartitionKey(vessel.vesselId)));
 }        
 await Task.WhenAll(concurrentTasks);

我收到以下错误消息,该错误消息无法提供太多信息?

Microsoft.Azure.Cosmos.CosmosException:'响应状态代码不正确 表示成功:BadRequest(400);子状态:1001; ActivityId :; 原因:();'

任何导致这种情况的指针是什么?这是我的设置: enter image description here

删除文档时遇到相同的问题:

CosmosClientOptions options = new CosmosClientOptions() { AllowBulkExecution = true,  MaxRetryAttemptsOnRateLimitedRequests=1000};
CosmosClient cosmosclient = new CosmosClient(connStr, options);
Container container = cosmosclient.GetContainer("CoachAPI", "Vessels");


var allItemsQuery = container.GetItemQueryIterator<string>("SELECT * FROM c.id");

List<Task> concurrentDeleteTasks = new List<Task>();

while (allItemsQuery.HasMoreResults)
{
    foreach (var item in await allItemsQuery.ReadNextAsync())
    {
        concurrentDeleteTasks.Add(container.DeleteItemAsync<string>(item, new PartitionKey("id")));
    }
}
            
await Task.WhenAll(concurrentDeleteTasks.Take(3));

引发以下错误: '响应状态代码不表示成功:未找到(404);子状态:0;

3 个答案:

答案 0 :(得分:0)

我来自CosmosDB工程团队。根据您的问题,已将容器上的分区键定义为/ vesselId,而文档已将vesselId映射到CoachVessel类中的“ id”属性。这是故意的吗?

如果在CreateItemAsync API中指定了可选的PartitionKey,则它需要与Document中的分区键匹配。如果希望将“ id”用作分区键,则需要将容器的分区键定义为“ id”,而不是“ vesselId”。在这种情况下,如果容器的分区键确实是/ vesselId,则代码期望输入文档中的属性“ vesselId”设置为分区键中指定的值vessel.vesselId。输入文档中似乎缺少“ vesselId”属性。

答案 1 :(得分:0)

分区键必须与文档主体中的属性匹配。将容器的分区键更改为/id,并修复删除代码以正确指定分区键。例如,

concurrentDeleteTasks.Add(container.DeleteItemAsync<string>(item, new PartitionKey(item.Id)));

答案 2 :(得分:0)

在我的情况下,以下错误是因为我将.Net SDK从v2更新到了v3,如果未通过ID,它将不再自动生成ID。

Microsoft.Azure.Cosmos.CosmosException:'响应状态代码不正确 表示成功:BadRequest(400);子状态:1001; ActivityId :; 原因:();'

我使用存储库模式,因此只需在调用CreateItemAsync之前添加一个检查:

if (item.Id == null)
{
    item.Id = Guid.NewGuid().ToString();
}