Cosmos DB - 使用Python删除文档

时间:2017-10-22 19:23:45

标签: python azure azure-cosmosdb

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_linkoptions

我可以将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元素。

在这个例子中,我创建了一个测试数据库,它看起来像这样 Screen grab from my Azure account

所以我认为我的分区键是/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

2 个答案:

答案 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找到以上说明。

更新答案:

我认为你误解了partitionkeyoptions[]属性的含义。

例如,我的容器创建如下:

enter image description here

我的文件如下:

{
    "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