Gerade und einfach abfragen, ich habe die folgende Funktion, die Verwendung von Google Cloud Datastor Node.js API:Google Cloud Datastor, wie für mehr Ergebnisse
fetchAll(query, result=[], queryCursor=null) {
this.debug(`datastoreService.fetchAll, queryCursor=${queryCursor}`);
if (queryCursor !== null) {
query.start(queryCursor);
}
return this.datastore.runQuery(query)
.then((results) => {
result=result.concat(results[0]);
if (results[1].moreResults === _datastore.NO_MORE_RESULTS) {
return result;
} else {
this.debug(`results[1] = `, results[1]);
this.debug(`fetch next with queryCursor=${results[1].endCursor}`);
return this.fetchAll(query, result, results[1].endCursor);
}
});
}
Das Datenspeicher-API-Objekt ist in der Variablen this.datastore
;
Das Ziel dieser Funktion ist alle Ergebnisse für eine bestimmte Abfrage, ungeachtet aller Grenzen für die Anzahl der Artikel pro Einzel runQuery
Aufruf zurückgegeben zu holen.
Ich habe noch nicht über irgendwelche bestimmten harten Grenzen auferlegt durch den Datenspeicher-API auf das herausgefunden und die Dokumentation scheint in diesem Punkt etwas undurchsichtig, aber ich merkte nur, dass ich immer results[1] = { moreResults: 'MORE_RESULTS_AFTER_LIMIT' }
bekommen, darauf hinweist, dass es sind noch mehr Ergebnisse zu holen, und die results[1].endCursor
bleibt auf konstanten Wert stecken, die bei jeder Iteration erneut weitergegeben wird.
Also, einige einfache Abfrage, die ich in diese Funktion einstecken, fahre ich nur weiter auf die Abfrage iterativ, setzen Sie die Abfrage Start-Cursor (query.start(queryCursor);
) auf die endCursor
im Ergebnis der vorherigen Abfrage erhalten. Und ich hoffe natürlich, dass ich bei jeder Iteration die nächsten Ergebnisse erhalten kann. Aber ich bekomme immer den gleichen Wert für results[1].endCursor
. Meine Frage ist: Warum?
// By default, google-cloud-node will automatically paginate through all of
// the results that match a query. However, this sample implements manual
// pagination using limits and cursor tokens.
function runPageQuery (pageCursor) {
let query = datastore.createQuery('Task')
.limit(pageSize);
if (pageCursor) {
query = query.start(pageCursor);
}
return datastore.runQuery(query)
.then((results) => {
const entities = results[0];
const info = results[1];
if (info.moreResults !== Datastore.NO_MORE_RESULTS) {
// If there are more results to retrieve, the end cursor is
// automatically set on `info`. To get this value directly, access
// the `endCursor` property.
return runPageQuery(info.endCursor)
.then((results) => {
// Concatenate entities
results[0] = entities.concat(results[0]);
return results;
});
}
return [entities, info];
});
}
(mit Ausnahme der Tatsache, dass ich von mir nicht eine Grenze für die Größe des Abfrageergebnisses angeben, was ich habe auch:
Konzeptionell kann ich keinen Unterschied zu this example given in the Google Documentation sehen versucht, indem Sie es auf 1000, die nichts ändert.)
Warum läuft mein Code in diese Endlosschleife, stecken auf jedem Schritt auf dem gleichen "endCursor"? Und wie korrigiere ich das?
Auch, was ist die harte Grenze für die Anzahl der Ergebnisse pro Anruf von ? Ich habe diese Informationen bisher nicht in der Google Datastore-Dokumentation gefunden.
Danke.
Vielen Dank für Ihre Mühe. Wie auch immer, dieses Beispiel würde in die gleiche Art von Endlosschleife laufen, über die ich verwirrt war. Es ist genau dieselbe Logik, soweit die rekursive Abfrage geht. – trollkotze
Nach einigem Suchen habe ich das Problem gefunden, dass 'NO_MORE_RESULTS' tatsächlich nie zurückgegeben werden kann, auch wenn es keine Ergebnisse mehr gibt. Also würde diese Schleife für immer weitergehen, wie in meinem Fall. Stattdessen wird 'MORE_RESULTS_AFTER_LIMIT' zurückgegeben, obwohl keine weiteren Ergebnisse vorliegen. Aber 'MORE_RESULTS_AFTER_LIMIT' gibt nur an, dass _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _. – trollkotze
Nun, ich habe es versucht. Ich neige dazu, die Client-Bibliotheken zu vermeiden und die REST-API direkt zu nutzen. Vielleicht können Sie das als eine Option versuchen. –