我遇到问题encountered in this question。因为另一个问题(和答案)缺少解决问题的要点,所以我正在写一个新问题。
orderBy(FieldPath.documentId(), 'desc')
以上查询将失败,并显示以下错误消息:
查询需要一个索引。您可以在这里创建它:...
如另一个问题所述,由于以下错误消息,因此无法创建该索引:
__ name__仅索引不支持
因为相反的查询可以正常工作:
orderBy(FieldPath.documentId(), 'asc')
我想知道为什么降序查询不起作用。对我来说,这实际上没有多大意义,尤其是因为这应该是一个非常常见的用例。
如果有解决上述问题的方法,那就是太棒了,也就是说,如果有一种方法可以创建使'desc'
起作用的索引。但是,我希望这不可能,因此会提出一个更广泛的问题。
我显然可以进行'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"
答案 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}}。