2017-10-22 3 views
1

In this SO question hatte ich gelernt, dass ich ein Cosmos DB-Dokument nicht mit SQL löschen kann.Cosmos DB - Dokument mit Python löschen

Mit Python glaube ich, ich brauche die DeleteDocument() Methode. So bekomme ich die Dokument-IDs, die (glaube ich) benötigt werden, um dann die DeleteDocument()-Methode aufzurufen.

# 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'] 

Nun, in diesem Stadium möchte ich DeleteDocument() anrufen. Die Eingänge, in die document_link und options sind.

kann ich document_link als so etwas wie

document_link = 'dbs/DB/colls/coll/docs/'+docID 

definieren und erfolgreich ReadAttachments() zum Beispiel nennen, die die gleichen Eingaben wie DeleteDocument() hat.

Wenn ich aber tun, ich einen Fehler ...

The partition key supplied in x-ms-partitionkey header has fewer 
components than defined in the the collection 

... und jetzt bin ich total

verloren

UPDATE

Im Anschluss an Jay Hilfe, Ich glaube, ich vermisse das Element in den Optionen.

In diesem Beispiel habe ich eine Testdatenbank erstellt, es sieht aus wie dieses Screen grab from my Azure account

Also ich denke, meine Partition Schlüssel /testPART

ist Wenn ich die partitionKey in den Optionen jedoch enthalten, keine Ergebnisse werden zurückgegeben, (und so print len(results) Ausgänge 0).

Entfernen partitionKey bedeutet, dass Ergebnisse zurückgegeben werden, aber der Löschversuch wie zuvor fehlschlägt.

# 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 

Antwort

2

Nach Ihrer Beschreibung, habe ich versucht, pydocument module zu verwenden Dokument in meinem azure document db zu löschen und es funktioniert für mich.

Hier ist mein Code:

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' 

Konsole Ergebnis:

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

Bitte beachten Sie, dass Sie die enableCrossPartitionQuery Eigenschaft auf Wahre in options wenn Ihre Dokumente einstellen müssen, sind cross-partitioned.

Muss für jede Abfrage, die über mehr als eine Partition ausgeführt werden muss, auf "true" gesetzt werden. Dies ist ein explizites Flag, das es Ihnen ermöglicht während der Entwicklungszeit bewusst Leistungsabschläge vorzunehmen.

Sie konnten obige Beschreibung von here finden.


aktualisieren Antwort:

Ich glaube, Sie die Bedeutung von partitionkey Eigenschaft im options[] falsch verstehen.

Zum Beispiel ist mein Container wie folgt erstellt:

enter image description here

Meine Dokumente wie folgt:

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

{ 
    "id": "2", 
    "name": "jay2" 
} 

Mein partitionkey ist 'name', so ich habe hier zwei paritions : 'Jay' und 'Jay1'.

Also, hier sollten Sie die partitionkey Eigenschaft auf 'Jay' oder 'Jay2', nicht 'Name' setzen.

Bitte ändern Sie den Code wie folgt:

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) 

Hoffe, dass es Ihnen hilft.

+0

Dank Jay, leider funktioniert das nicht für mich - Übergabe in diesen Optionen mit 'enableCrossPartitionQuery' als' True' oder 'False' - Fehler ist in der gleichen wie in der Frage –

+0

@BenMayo Es ist werid. Der obige Code funktioniert gut für mich. Wenn Sie es vollständig versuchen, würden Sie bitte allgemeine Struktur Ihrer Datenbank aktualisieren, damit ich Ihnen helfen kann, dieses Problem zu lösen? In, könnten Sie sich auf diesen Fall beziehen: https: //stackoverflow.com/questions/42999586/read-document-from-documentdb-by-id-using-node-js-fails/43002819#43002819 –

+0

Will tun und aktualisiere dich. Danke Jay. –

Verwandte Themen