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_link和options。
我可以定义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了选项中的内容。
所以我认为我的分区键是 /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)
根据您的描述,我尝试使用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属性设置为True。optionscross-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)
希望对您有帮助。
| 归档时间: |
|
| 查看次数: |
1977 次 |
| 最近记录: |