2016-08-05 25 views
1

Ich habe einen Datensatz mit Altdaten. Wir sortieren nach einem Feld, das nur in neueren Dokumenten vorhanden ist.DocumentDB ORDER BY Entfernen undefined

Wenn ich nach diesem Feld sortiere, werden nur die Objekte zurückgegeben, die diesen Wert haben, selbst wenn sie die WHERE-Klausel bestehen.

Wie erhalten wir eine sortierte Menge an die Spitze für Objekte, die das Feld haben, und alle diejenigen, die nicht am Ende nicht sortiert sind?

Ich habe so etwas wie dies versucht, aber es ist nicht gültig:

SELECT T.id, IS_DEFINED(T.createdDate) ? T.createdDate : "2000-01-01T00:00:00" AS createdDate FROM Themes T 
WHERE T.customerId = 43333 
AND T.isDefault = false 
AND (NOT IS_DEFINED(T.isArchived) OR T.isArchived = false) 
ORDER BY createdDate ASC 

ich auch versucht:

SELECT T.id FROM Themes T 
WHERE T.customerId = 43333 
AND T.isDefault = false 
AND (NOT IS_DEFINED(T.isArchived) OR T.isArchived = false) 
ORDER BY IS_DEFINED(T.createdDate) ? T.createdDate : "2000-01-01T00:00:00" ASC 
+0

Können Sie die Client-Seite sortieren? –

+0

Es ist eine Option, aber wird beinhalten, einen großen Teil des Systems neu zu schreiben. –

+0

Können Sie die alten Dokumente mit dem Standardwert für dieses Feld füllen? –

Antwort

1

Kurz dieses Feldes in den Dokumenten bevölkern, wo es fehlt, ist die einzige Ich weiß, es wäre, alle Daten zurückzugeben und die Clientseite zu sortieren.

Ich frage mich, ob Sie ORDER BY durch ein projiziertes Feld und/oder wenn Sie SQL-Fall und Wert Substitution Funktionen in SQL-Untermenge von DocumentDB verwenden können ... und wenn ja, sind sie effizient?

Der Flaschenhals für mein System ist DocumentDB RUs, also versuche ich so viel wie möglich Client-Seite zu tun, aber ich würde gerne wissen, ob dies in DocumentDB SQL möglich und effizient ist.

+0

Dies ist der Ansatz, für den ich mich entschieden habe. Ich projizierte alle Felder, die ich sortieren wollte, in ein SortableInfo-Objekt, sortierte das im Speicher und schnitt von dort aus. Würde gerne eine Art, um durch so zu sehen: ORDER BY CreatedDate WENN NICHT DEFINIERT DateTime.Min oder eine andere Syntax, die uns die ORDER BY-Wert ersetzen kann, wenn es nicht definiert ist. –

+0

Alternativ möchte ich eine verschachtelte Abfrage sehen, die Standardwerte projiziert, und dann nach der äußeren Abfrage sortieren. Aber ich bin mir nicht sicher, welche Auswirkungen dies hätte. –

0

In den schemalosen Datenbanken gibt es keine definierte Konvention für die Typreihenfolge, geschweige denn für die undefinierten Einträge beim Sortieren. Ihre Anforderung ist trotzdem gültig.

Derzeit ist die beste Lösung für diese in DocumentDB, ist zwei Teil-Abfragen zu tun -

  1. Geben Sie für NICHT IS_DEFINED Dokumente
  2. Abfrage für ORDER BY

Wenn die Anzahl der Dokumente ohne Die isArchived-Eigenschaft ist wenig und fest, dann ist es möglicherweise eine gute Idee, diese Liste vorzubereiten und in einem separaten Dokument zu speichern, damit die erste Abfrage viel schneller ist, wenn das Dokument einmal erstellt wurde. Sie müssen lediglich die Dokumente nach "id" für alle Einträge in diesem Metadatendokument abfragen und sie zuerst abrufen.