首页 > 解决方案 > 使用 Firestore REST API 在结构化查询中设置“orderBy”

问题描述

第一篇文章,所以任何提示将不胜感激。我正在尝试使用 REST api 在 StructuredQuery 中设置一个“orderBy”来进行存储。如果未使用 orderBy 字段,请注意我的查询确实有效,这也很有帮助。

我的查询如下所示:

var collection = "testing";
var Query = {        //body of the http request
  "structuredQuery": {
    "from": {
      "collectionId":collection,
      "allDescendants":true
    },
    "orderBy": {
      "field": {
        "fieldPath" : "uploaded"
      },
      "direction" : "DESCENDING"
    },
    "limit": 1
  },
  "newTransaction": {}
}
var urlPOST = "https://firestore.googleapis.com/v1beta1/projects/"+id+"/databases/"+database+"/documents:runQuery?key="+key;
var optPOST = {                //http header
  'method' : 'post',
  'contentType' : 'application/json',
  'muteHttpExceptions': true,
  'payload': JSON.stringify(Query)
};
var response = UrlFetchApp.fetch(urlPOST, optPOST);

从这个请求我得到:

"error": {
  "code": 400,
  "message": "The query requires a COLLECTION_GROUP_DESC index for collection testing and field uploaded. You can create it here: https://console.firebase.google.com/project/<mydatabase>/database/firestore/indexes/single-field ",
    "status": "FAILED_PRECONDITION"
}

Googles firestore API doco 说它应该给我一个链接来创建所需的索引,但是这里返回的链接没有这样做,而是让我返回到概述页面。

关于我正在尝试做的更多细节:我希望能够从数据库中获取最后上传的文档。我通过一个字段“上传”来做到这一点,它只是一个时间戳字段(通过调用 firestore.SERVER_TIMESTAMP 的 firestore_admin 库通过 python 脚本上传)

让我知道是否需要更多信息

提前致谢

标签: javascriptrestfirebasegoogle-cloud-firestore

解决方案


TL;DR - 该allDescendants字段现在没有做任何有用的事情,你不应该使用它。它被放入协议中是为了期待尚未推出的名为“收集组查询”的功能。


如您所见,除了其他约束子句之外,每个 Firestore 查询都有一个parent和一个目标。collectionId

在你的情况下parent/projects/$YOUR_PROJECT/datbases/(default)/,所以基本上是你的数据库的根。collectionId是您正在搜索文档的集合的名称,您已将其指定为testing

allDescendants为 false 时,它​​将仅搜索具有该名称且是父代的直接后代的集合。在这种情况下,这意味着它将搜索集合/testing

如果allDescendants设置为truesearch 将覆盖在 parent 下任何深度名为“testing”的任何集合。因此,不仅如此/testing,而且像/widgets/foo/testing然而,完成此查询需要我们所谓的“集合组”索引,如错误消息中所示。现在你没有办法创建这样的索引,这就是为什么我上面说这个参数基本上没有用。

正如我们在其他一些论坛上所说,我们确实打算在将来发布这种类型的查询,在这种情况下,allDescendants参数会更有用。


推荐阅读