DocumentDB ORDER BY删除undefined

时间:2016-08-05 14:19:51

标签: azure azure-cosmosdb

我有一个包含遗留数据的数据集。我们按字段排序,该字段仅出现在较新的文档中。

当我按此字段排序时,只返回具有此值的对象,即使它们传递了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

2 个答案:

答案 0 :(得分:2)

如果在缺少的文档中填充该字段,我知道这样做的唯一方法就是返回所有数据并进行排序客户端。

我想知道你是否可以对一个预测字段进行ORDER BY和/或你是否可以在DocumentDB的SQL子集中使用SQL的case和value替换功能......如果是这样,它们是否有效?

我的系统的瓶颈是DocumentDB RUs,所以我尝试尽可能多地做客户端,但我很想知道这在DocumentDB的SQL中是否可行和高效。

答案 1 :(得分:1)

在无模式数据库中,类型顺序没有定义约定,更不用说排序时未定义的条目。尽管如此,您的要求仍然有效。

目前DocumentDB中最好的解决方案是执行两部分查询 -

  1. 查找NOT IS_DEFINED文档
  2. 查询ORDER BY
  3. 如果没有isArchived属性的文档数量很少并且已修复,那么准备该列表并将其保存在单独的文档中可能是个好主意,这样一旦构建文档一次查询就会快得多。您所需要的只是通过" id"来查询文档。对于该元数据文档中的所有条目并首先检索它们。