2016-09-23 5 views
0

Ich versuche DocumentDB als einen möglichen Datenspeicher für eine neue Anwendung. Da die App viele Daten verarbeiten muss, habe ich das Datenmigrationstool verwendet, um viele Dokumente in eine Sammlung aufzunehmen.DocumentDB Stored Procedure Continuation

Die meisten Abfragen aus meiner App aggregieren und summieren. Also benutze ich Documentdb-Lumenize. Die code sample für diese gespeicherte Prozedur von C# Aufruf hat mich so etwas wie dies zu tun:

var configString = @"{ 
     cubeConfig: { 
      groupBy: 'year', 
      field: 'Amount', 
      f: 'sum' 
     }, 
     filterQuery: 'SELECT * FROM TestLargeData t' 
    }"; 

var config = JsonConvert.DeserializeObject<object>(configString); 
var result = await _client.ExecuteStoredProcedureAsync<dynamic>("my/sproc/link", config); 

Das Ergebnis, das ich zurück wie folgt aussieht:

{ 
    "cubeConfig": { 
    "groupBy": "year", 
    "field": "Amount", 
    "f": "sum" 
    }, 
    "filterQuery": "SELECT * FROM TestLargeData t", 
    "continuation": "-RID:rOtjAPc4TgBxFwAAAAAAAA==#RT:6#TRC:6000", 
    "stillQueueing": false, 
    "savedCube": { 
    "config": { 
     "groupBy": "year", 
     "field": "Amount", 
     "f": "sum" 
    }, 
    "cellsAsCSVStyleArray": [ 
     [ 
     "year", 
     "_count", 
     "Amount_sum" 
     ], 
     [ 
     2006, 
     4825, 
     1391399555.74 
     ], 
     [ 
     2007, 
     1175, 
     693886378 
     ] 
    ], 
    "summaryMetrics": {} 
    }, 
    "example": { 
    "year": 2007, 
    "SomeOtherField1": "SomeOtherValue1", 
    "SomeOtherField2": "SomeOtherValue2", 
    "Amount": 12000, 
    "id": "0ee80b66-7fa7-40c1-9124-292c01059562", 
    "_rid": "...", 
    "_self": "...", 
    "_etag": "\"...\"", 
    "_attachments": "attachments/", 
    "_ts": ... 
    } 
} 

Die _count Werte zeigen an, dass ich wieder 6.000 Dokumente wert von aggregierten Daten. Es gibt eine Million Dokumente in der Sammlung (ich wollte groß testen!)

Ich sehe die "Fortsetzung" -Wert im Ergebnis. Aber StoredProcedureResponse hat keine ExecuteNextAsync-Methode wie die DocumentQuery-Klasse. Wie verwende ich die DocumentDB-API, um den nächsten Teil der Daten anzufordern?

Antwort

2

Ich bin der Autor von Documentdb-Lumenize. Wenn Sie nur den zurückgegebenen Wert als einzigen Parameter zurücksenden, weiß der Dokumentdocumentdb-lumenize-Sproc, wie er mit dem Fortsetzungstoken umgehen soll. Sie müssen es weiter aufrufen, bis das Fortsetzungstoken leer ist.

Das heißt, ich bin wirklich überrascht, dass es nur 6000 in einer Runde gemacht hat. Ich bekomme im Allgemeinen 20-50K pro Hin- und Rückflug. Vielleicht haben Sie eine niedrigere Sammlung? Vielleicht macht es einen Index-losen Full-Scan?

Senden Sie ein Problem in der GitHub Repo, wenn Sie mehr 1: 1 Hilfe mit diesem möchten.

+0

Danke Larry. Mit "zurücksenden, was zurückgegeben wird" meinst du, das gesamte "Ergebnis" JSON, das ich bekommen habe, zu nehmen und "configString" damit zu ersetzen? –

+1

Ja, das gesamte Ergebnis. Wenn das groß wird, habe ich eine Version, die den Status in einem Dokument speichert und einfach ein Token hin und her gibt. Sie müssen es immer noch anrufen, aber die Nutzlast ist stark reduziert. Lassen Sie mich wissen, wenn Sie diese Version möchten. –

+0

Ich werde es versuchen und folgen. Vielen Dank für Ihre Hilfe! –