如何获取按DocumentID降序排列的文档?

时间:2018-08-31 16:05:59

标签: firebase google-cloud-firestore

我遇到问题encountered in this question。因为另一个问题(和答案)缺少解决问题的要点,所以我正在写一个新问题。

orderBy(FieldPath.documentId(), 'desc')

以上查询将失败,并显示以下错误消息:

  

查询需要一个索引。您可以在这里创建它:...

如另一个问题所述,由于以下错误消息,因此无法创建该索引:

  

__ name__仅索引不支持

因为相反的查询可以正常工作

orderBy(FieldPath.documentId(), 'asc')

我想知道为什么降序查询不起作用。对我来说,这实际上没有多大意义,尤其是因为这应该是一个非常常见的用例。

如果有解决上述问题的方法,那就是太棒了,也就是说,如果有一种方法可以创建使'desc'起作用的索引。但是,我希望这不可能,因此会提出一个更广泛的问题。

我如何真正按文档ID降序获取我的文档?

我显然可以进行'asc'查询,然后反转检索到的列表。
但这不起作用,因为我需要limit()查询。我不能仅仅为了获得降序而支付集合中的所有文档的费用。
这样,即使我只想得到一个文件(最后一个),我将为所有文档读取收费一个)Here is a great article discussing potential consequences of this,因为它无法缩放

我真的需要创建一个名为id的字段,该字段包含完全相同的 documentID,只是要在其上创建索引,然后能够递减查询?
潜在的收藏可能看起来像这样:

"q":
 - id: "q"
"u":
 - id: "u"
"i":
 - id: "i"
"t":
 - id: "t"
"e":
 - id: "e"
"d":
 - id: "d"
"u":
 - id: "u"
"m":
 - id: "m"
"b":
 - id: "b"

2 个答案:

答案 0 :(得分:2)

当前无法基于文档ID执行降序查询。您可以选择将文档ID放在文档的字段中,然后用于订购。

为此也可以file a feature request,但短期内不太可能发生。

答案 1 :(得分:0)

这是一个怪异的解决方法,但是如果您有其他where条件,则可以对文档ID降序排序。这是PHP。我只在相等条件下对此进行了测试。

因此,即使这行不通(创建索引链接失败,导致错误“ __name__仅不支持索引”):

$docs = $fsClient
    ->collection('incidents')
    ->orderBy(FieldPath::documentId(), 'DESC')
    ->documents();

这样做:

$docs = $fsClient
    ->collection('incidents')
    ->orderBy(FieldPath::documentId(), 'DESC')
    ->where('dummy-field', '=', true)
    ->documents();

这确实要求您向所有文档中添加一个值为dummy-field的{​​{1}}。