【问题标题】:How to get documents descending by DocumentID?如何获取按 DocumentID 降序的文档?
【发布时间】:2018-08-31 16:05:59
【问题描述】:

我遇到了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"

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    目前无法根据文档 ID 执行降序查询。您的替代方法是将文档 ID 放在文档的一个字段中,然后使用该字段进行排序。

    对此也欢迎file a feature request,但短期内不太可能发生。

    【讨论】:

    • 自从这个答案你们已经介绍了 .limitToLast() 查询方法。可以执行 startAfter(lastDocSnap.id).limit(n) 但 endBefore(firstDocSnap.id).limitToLast(n) 导致 name 仅索引不受支持。这意味着幕后有一个隐含的升序索引,但默认情况下没有降序索引?为什么不两者兼而有之?
    • 这个答案已经过时了,你现在可以这样做。
    【解决方案2】:

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

    所以,即使这不起作用(创建索引链接失败,导致错误“__name__ only index is not supported”):

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

    这样做:

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

    这确实需要您在所有文档中添加一个值为truedummy-field

    【讨论】:

    • 编辑:这似乎实际上并没有按降序排序
    • @forresthopkinsa 我刚刚仔细检查过,这对我有用。如果您有时间,我很想看看这个技术不会导致结果按降序排序的示例。
    • 您使用的是自动还是手动文档 ID?
    • 我的用例是文档 ID 是数字(当然是字符串),所以:“1001”、“1002”、“1003”......当我按降序请求它们时使用这种技术,它们以升序顺序返回,这恰好也是插入顺序
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 2018-05-06
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多