如何在不知道分区键值的情况下从Cosmos DB中删除对象?

时间:2018-08-18 02:27:35

标签: c# azure-cosmosdb

如果我没有分区键值,如何删除文档?

我有文档的def createString(n: Int): String = { // do something here result = "?, ?, ?, ?, ?, ?, ? " // thera are n "? " in result result } 和分区键的属性名称(在我的情况下为["? "]*n)。

我尝试过:

id

错误:type

示例文档:

var docLink = UriFactory.CreateDocumentUri(databaseName, collectionName, documentId);
var resp = client.DeleteDocumentAsync(docLink).Result;

我试图获取特定文档ID的分区键值

使用C#代码...

我尝试按文档PartitionKey value must be supplied for this operation.读取文档,然后提取{ "id": "AB12CD", "type": "Company", "Address": "123 Test Street" } 值,但出现错误:id,原因是使用以下代码。

type

我还尝试通过以下方法来尝试跨分区查询:

InvalidOperationException: PartitionKey value must be supplied for this operation.

^返回一个空列表。如果我在Azure门户上进行检查,则可以看到具有特定ID的文档确实存在于数据库中。

2 个答案:

答案 0 :(得分:2)

只需参考此doc,您就会找到答案。

在C#代码中,请使用Undefined.Value,一切都会好起来的。

client.DeleteDocumentAsync(
          UriFactory.CreateDocumentUri(DbName, CollectionName, id), 
          new RequestOptions() { PartitionKey = new PartitionKey(Undefined.Value) });

希望它对您有帮助。


更新答案:

也许我昨天误会了您的要求,让我在这里重新进行说明。

首先,您的集合按分区字段type进行分区。

1。如果您不知道分区键的值并且文档中确实有一个分区字段,请使用EnableCrossPartitionQuery属性。

FeedOptions queryOptions = new FeedOptions
        {
            MaxItemCount = 10,
            EnableCrossPartitionQuery = true
        };
 var id = '1';
 var queryString = "SELECT * FROM c WHERE c.id= '" + id + "'";
 var QueryInSql = client.CreateDocumentQuery<JObject>(
                        uri,
                        queryString,
                        queryOptions).AsDocumentQuery();
 var result = QueryInSql.ExecuteNextAsync<JObject>().Result;

 var res = result.ToList<JObject>(); //if result has nothing, will be empty list


 Console.WriteLine("\nRead {0}", res[0]);

2。如果您知道分区键的值并且文档中确实有一个分区字段,请在FeedOptions中传递分区键属性。

3。如果您知道文档在分区集合中没有分区字段,请使用Undefined.Value

答案 1 :(得分:1)

万一有人使用python sdk来到delete_item。如果该项目没有定义分区键

将空字典传递到partition_key参数以删除该项目。

cosmosContainerClient.delete_item(item['id'], partition_key={})