在this SO question我了解到我无法使用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']
现在,在这个阶段,我想打电话给DeleteDocument()
。
输入为document_link
和options
。
我可以将document_link
定义为
document_link = 'dbs/DB/colls/coll/docs/'+docID
例如,成功拨打ReadAttachments()
,其输入与DeleteDocument()
相同。
但是,当我这样做时,我收到错误......
The partition key supplied in x-ms-partitionkey header has fewer
components than defined in the the collection
......现在我完全失去了
更新
继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
答案 0 :(得分:3)
根据您的说明,我尝试使用pydocument module删除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'
控制台结果:
[{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
请注意,如果您的文档为enableCrossPartitionQuery
,则需要在options
中将cross-partitioned
属性设置为 True 。
对于任何需要执行的查询,必须设置为true 多个分区。这是一个明确的标志,使您能够 在开发期间进行有意识的性能权衡。
您可以从here找到以上说明。
更新答案:
我认为你误解了partitionkey
中options[]
属性的含义。
例如,我的容器创建如下:
我的文件如下:
{
"id": "1",
"name": "jay"
}
{
"id": "2",
"name": "jay2"
}
我的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)
希望它对你有所帮助。
答案 1 :(得分:0)
使用 azure.cosmos 库:
安装并导入azure cosmos包:
from azure.cosmos import exceptions, CosmosClient, PartitionKey
定义删除项目函数 - 在这种情况下使用查询中的分区键:
def deleteItems(deviceid):
client = CosmosClient(config.cosmos.endpoint, config.cosmos.primarykey)
# Create a database if not exists
database = client.create_database_if_not_exists(id=azure-cosmos-db-name)
# Create a container
# Using a good partition key improves the performance of database operations.
container = database.create_container_if_not_exists(id=container-name, partition_key=PartitionKey(path='/your-pattition-path'), offer_throughput=400)
#fetch items
query = f"SELECT * FROM c WHERE c.device.deviceid IN ('{deviceid}')"
items = list(container.query_items(query=query, enable_cross_partition_query=False))
for item in items:
container.delete_item(item, 'partition-key')
用法:
deviceid=10
deleteItems(items)
github 完整示例在此:https://github.com/eladtpro/python-iothub-cosmos