2017-10-27 3 views
0

Ich versuche, mit einer Partition Schlüssel /newpartPartition Key Fehler bei der gespeicherten Prozedur läuft

nur einen einzelnen Datensatz in eine Sammlung einfügen, um sicherzustellen, ich bin zu interpretieren, was eine Partition Schlüssel ist, bin ich es unter der Annahme, ist der Wert wie hier gezeigt.

enter image description here

Innerhalb dieser Kollektion habe ich eine gespeicherte Prozedur namens createMyDocument die

enthält
function createMyDocument(documentToCreate) { 
    var context = getContext(); 
    var collection = context.getCollection(); 

    var accepted = collection.createDocument(collection.getSelfLink(), 
      documentToCreate, 
      function (err, documentCreated) { 
       if (err) throw new Error('Error' + err.message); 
       context.getResponse().setBody(documentCreated.id) 
      }); 
    if (!accepted) return; 
} 

Ich nenne das über Python mit:

config = { 
    'ENDPOINT': 'deleted', 
    'MASTERKEY': 'deleted', 
    'DOCUMENTDB_DATABASE': 'database', 
    'DOCUMENTDB_COLLECTION': 'newup' 
}; 

client = document_client.DocumentClient(config['ENDPOINT'], {'masterKey': config['MASTERKEY'] ,'DisableSSLVerification' : 'true' }) 
data = {"name":"Ben","age":30,"city":"New York"} 
client.ExecuteStoredProcedure('dbs/database/colls/newup/sprocs/createMyDocument', data, {"partitionKey" : "/newpart"}) 

Der Fehler zurückgegeben wird Requests originating from scripts cannot reference partition keys other than the one for which client request was submitted

So verwirrt mich die Fehlermeldung, weil die gespeicherte Prozedur (nach meinem Verständnis) in der Sammlung mit einem Partitionsschlüssel von /newpart gespeichert ist. Das ist die gleiche Sammlung und daher derselbe Partitionsschlüssel (?), In den ich das Dokument einfügen möchte. Der Fehler deutet jedoch auf etwas anderes hin.

Antwort

2

Wenn die gespeicherte Prozedur vom Client ausgeführt wird, geben RequestOptions den Partitionsschlüssel an, die gespeicherte Prozedur wird im Kontext dieser Partition ausgeführt und kann nicht mit Dokumenten arbeiten, die einen anderen Partitionsschlüsselwert haben (z. B. erstellen).

Sie können die gespeicherte Prozedur vom Client für jeden Partitionsschlüssel ausführen. Wenn die gespeicherte Prozedur zum Beispiel Dokumente in großen Mengen erstellen soll, können Sie die Dokumente nach dem Partitionsschlüssel gruppieren und jede Gruppe (kann parallel ausgeführt werden) an die gespeicherte Prozedur senden, die den Partitionsschlüsselwert in RequestOptions bereitstellt. Wäre das hilfreich?

Sie müssen keine gespeicherte Prozedur für jeden Partitionsschlüssel erstellen, sondern nur einmal ohne Angabe des Partitionsschlüssels.

Laut Ihrem Code scheint es, dass Sie versuchen, ein Dokument ohne Partitionsschlüssel einzufügen, und es wird in einer speziellen Partition für Dokumente ohne Partitionsschlüssel gruppiert.

Darüber hinaus können Sie auf diesen Thread verweisen: Azure DocumentDB - Requests originating from scripts cannot reference partition keys other than the one for which client request was submitted

Hoffnung es Ihnen hilft.

aktualisieren

Bitte ändern Sie den Code wie folgt:

data = {"name":"Ben","age":30,"city":"New York","newpart":"11"} 

client.ExecuteStoredProcedure('dbs/db/colls/newcoll/sprocs/createMyDocument', data , {"partitionKey": "11"}) 

Da Ihre Sammlung hat einen Partitionierungsschlüssel-Set, das Dokument, das Sie einfügen möchten, müssen Sie die Partitionierungsschlüssel festgelegt haben, da sonst die Datenbank weiß nicht, auf welcher Partition es platziert werden soll.

Natürlich sollte der Partitionierungsschlüssel, der im Dokument festgelegt wird, auch mit dem Partitionierungsschlüssel übereinstimmen, der bei t gesetzt wird Die gespeicherte Prozedur wird ausgeführt, andernfalls wird das obige Problem auftreten. Weil Sie nur die Partitionen bearbeiten können, die Sie beim Ausführen der gespeicherten Prozedur eingerichtet haben.

+0

Sorry Jay, bin immer noch verwirrt. Muss ich den Partitionsschlüssel in der Zeile 'data = {" name ":" Ben "," age ": 30," city ":" New York "} oder in der Zeile" client "übergeben.ExecuteStoredProcedure ('dbs/datenbank/kolls/newup/sprocs/createMyDocument', daten, {"partitionKey": "/ newpart"}) '? Wenn ich den Partitionsschlüssel aus der zweiten Zeile entferne, tritt der Fehler auf, dass der Partitionsschlüssel nicht geliefert wird. Können Sie meinen Code ändern, um mir zu zeigen, was Sie meinen, oder fehlt mir etwas Grundlegendes in meinem Verständnis? –

+0

@BenMayo Sicher! Bitte geben Sie mir etwas Zeit, um meine Antwort zu Ihrem Code zu aktualisieren. –

+0

@BenMayo Hallo, bitte sehen Sie meine Update-Antwort. Danke! Jede Sorge, lassen Sie mich –

Verwandte Themen