2016-08-05 19 views
1

我有一個包含遺留數據的數據集。我們按照只存在於較新文檔中的字段進行排序。DocumentDB ORDER BY刪除未定義

當我按此字段進行排序時,即使它們傳遞了WHERE子句,也只返回具有此值的對象。

我們如何獲得頂部的有序集合以獲得具有該字段的對象,並且所有那些在末尾未被排序的對象?

我一直想這樣的事情,但它是無效的:

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 

我也曾嘗試:

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

你可以對客戶端進行排序嗎? –

+0

這是一個選項,但會涉及重新編寫大量的系統。 –

+0

您可以使用該字段的默認值填充舊文檔嗎? –

回答

1

短填充在它缺少證件的那場,唯一的我知道這樣做的方式是返回所有數據並執行排序客戶端。

我在想,如果您可以按照投影字段排序和/或如果您可以在DocumentDB的SQL子集中使用SQL的大小寫和值替換功能......如果是這樣,它們是否有效?

我的系統的瓶頸是DocumentDB RU,所以我儘可能地儘量做到客戶端,但我很想知道這在DocumentDB的SQL中是否可行和高效。

+0

這是我最終選擇的方法。我將所有想要排序的字段投影到一個SortableInfo對象中,並將它們存儲在內存中並從那裏切片。 很想通過這樣看到某種順序: ORDER BY CreatedDate undefined時DateTime.Min 或者一些其他的語法,使我們能夠代替ORDER BY值,當它是不確定的。 –

+0

另外我想看到一個預測默認值的嵌套查詢,然後對外部查詢進行排序。但我不確定會有什麼樣的性能影響。 –

0

在無模式數據庫中,沒有關於類型順序的定義約定,更不用說在排序時未定義的條目。儘管如此,您的要求仍然有效。

目前這種在DocumentDB最好的解決辦法,是做兩個部分查詢 -

  1. 看不IS_DEFINED文件
  2. 查詢的ORDER BY

如果文件沒有數量isArchived屬性很少並且是固定的,那麼準備該列表並將其保存在單獨的文檔中可能是一個好主意,因此一旦構建一次文檔,第一個查詢就快得多。您只需要通過「id」查詢該元數據文檔中所有條目的文檔,並首先檢索它們。