Cosmos DB-使用Python删除文档

Ben*_*ayo 2 python azure azure-cosmosdb

这个SO问题中,我了解到无法使用SQL删除Cosmos DB文档。

使用Python,我相信我需要该DeleteDocument()方法。这就是我获取所需的文档ID的方式(我相信),然后调用该DeleteDocument()方法。

# set up the client
client = document_client.DocumentClient()

# use a SQL based query to get a bunch of documents
query = { 'query': 'SELECT * FROM server s' }
result_iterable = client.QueryDocuments('dbs/DB/colls/coll', query, options)

results = list(result_iterable);

for x in range(0, len (results)):
    docID = results[x]['id']
Run Code Online (Sandbox Code Playgroud)

现在,在这个阶段我想打电话给DeleteDocument()。输入到其中的document_linkoptions

我可以定义document_link

document_link = 'dbs/DB/colls/coll/docs/'+docID
Run Code Online (Sandbox Code Playgroud)

并成功调用ReadAttachments()例如,其输入与相同DeleteDocument()

但是,当我这样做时,我会得到一个错误...

The partition key supplied in x-ms-partitionkey header has fewer
components than defined in the the collection
Run Code Online (Sandbox Code Playgroud)

...现在我完全迷路了

更新

在杰伊(Jay)的帮助下,我相信我错过partitonKey了选项中的内容。

在这个例子中,我创建了一个测试数据库,它看起来像这样 我的Azure帐户的屏幕抓取

所以我认为我的分区键是 /testPART

partitionKey但是,当我在选项中包括时,不会返回任何结果(因此print len(results)输出为0)。

删除partitionKey意味着返回结果,但是删除尝试仍然失败。

# Query them in SQL
query = { 'query': 'SELECT * FROM c' }

options = {}
options['enableCrossPartitionQuery'] = True
options['maxItemCount'] = 2
options['partitionKey'] = '/testPART'
result_iterable = client.QueryDocuments('dbs/testDB/colls/testCOLL', query, options)
results = list(result_iterable)

# should be > 0
print len(results)

for x in range(0, len (results)):
    docID = results[x]['id']
    print docID
    client.DeleteDocument('dbs/testDB/colls/testCOLL/docs/'+docID, options=options)
    print 'deleted', docID
Run Code Online (Sandbox Code Playgroud)

Jay*_*ong 5

根据您的描述,我尝试使用pydocument模块删除我的文档azure document db,它对我有用

这是我的代码:

import pydocumentdb;
import pydocumentdb.document_client as document_client

config = {
    'ENDPOINT': 'Your url',
    'MASTERKEY': 'Your master key',
    'DOCUMENTDB_DATABASE': 'familydb',
    'DOCUMENTDB_COLLECTION': 'familycoll'
};

# Initialize the Python DocumentDB client
client = document_client.DocumentClient(config['ENDPOINT'], {'masterKey': config['MASTERKEY']})

# use a SQL based query to get a bunch of documents
query = { 'query': 'SELECT * FROM server s' }

options = {}
options['enableCrossPartitionQuery'] = True
options['maxItemCount'] = 2

result_iterable = client.QueryDocuments('dbs/familydb/colls/familycoll', query, options)

results = list(result_iterable);

print(results)

client.DeleteDocument('dbs/familydb/colls/familycoll/docs/id1',options)

print 'delete success'
Run Code Online (Sandbox Code Playgroud)

控制台结果:

[{u'_self': u'dbs/hitPAA==/colls/hitPAL3OLgA=/docs/hitPAL3OLgABAAAAAAAAAA==/', u'myJsonArray': [{u'subId': u'sub1', u'val': u'value1'}, {u'subId': u'sub2', u'val': u'value2'}], u'_ts': 1507687788, u'_rid': u'hitPAL3OLgABAAAAAAAAAA==', u'_attachments': u'attachments/', u'_etag': u'"00002100-0000-0000-0000-59dd7d6c0000"', u'id': u'id1'}, {u'_self': u'dbs/hitPAA==/colls/hitPAL3OLgA=/docs/hitPAL3OLgACAAAAAAAAAA==/', u'myJsonArray': [{u'subId': u'sub3', u'val': u'value3'}, {u'subId': u'sub4', u'val': u'value4'}], u'_ts': 1507687809, u'_rid': u'hitPAL3OLgACAAAAAAAAAA==', u'_attachments': u'attachments/', u'_etag': u'"00002200-0000-0000-0000-59dd7d810000"', u'id': u'id2'}]
delete success
Run Code Online (Sandbox Code Playgroud)

请注意,如果文档为,则需要将enableCrossPartitionQuery属性设置为Trueoptionscross-partitioned

对于需要跨多个分区执行的任何查询,必须将其设置为true。这是一个明确的标志,使您能够在开发期间进行有意识的性能折衷。

您可以从此处找到以上描述。


更新答案:

我认为您误解了partitionkey财产的含义options[]

例如,我的容器是这样创建的:

在此处输入图片说明

我的文件如下:

{
    "id": "1",
    "name": "jay"
}

{
    "id": "2",
    "name": "jay2"
}
Run Code Online (Sandbox Code Playgroud)

的名字partitionkey'name',所以这里有两个分区:'jay''jay1'

因此,在这里应将partitionkey属性设置为“ jay”或“ jay2”,而不是“ name”。

请按以下方式修改您的代码:

 options = {}
    options['enableCrossPartitionQuery'] = True
    options['maxItemCount'] = 2
    options['partitionKey'] = 'jay' (please change here in your code)

    result_iterable = client.QueryDocuments('dbs/db/colls/testcoll', query, options)
    results = list(result_iterable);

    print(results)
Run Code Online (Sandbox Code Playgroud)

希望对您有帮助。