Установка 'orderBy' в StructuredQuery с помощью Firestore REST API - PullRequest
0 голосов
/ 12 декабря 2018

первый пост, поэтому любые советы будут оценены.Я пытаюсь установить 'orderBy' в StructuredQuery, используя REST API для Firestore.Также полезно отметить, что мой запрос работает, если поле 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 говорит, что он должен дать мне ссылку для создания требуемого индекса, но возвращенная здесь ссылка не делает этого, вместо этого он возвращает меня на страницу обзора.

Чуть большеподробно о том, что я пытаюсь сделать: я хочу получить последний загруженный документ из базы данных.я делаю это, имея поле «uploaded», которое является просто полем TimeStamp (загружается с помощью скрипта python с использованием библиотеки firestore_admin, вызывающей firestore.SERVER_TIMESTAMP)

Дайте мне знать, если требуется дополнительная информация

Заранее спасибо

1 Ответ

0 голосов
/ 12 декабря 2018

TL; DR - поле allDescendants сейчас не приносит никакой пользы, и вы не должны его использовать.Он был помещен в протокол в ожидании функции, которая называется «Коллекции групповых запросов», которая еще не запущена.

Как вы можете видеть, каждый запрос Firestore имеет parent и цель collectionId, в дополнение к другим пунктам ограничения.

В вашем случае parent равен /projects/$YOUR_PROJECT/datbases/(default)/, поэтому в основномкорень вашей БД.collectionId - это имя коллекции, которую вы ищете для документов, которую вы указали как testing.

Когда allDescendants имеет значение false, тогда он будет искать только коллекции с таким именем, которыеявляются прямым потомком родителя.В этом случае это означает, что он будет искать коллекцию /testing.

Если для allDescendants установлено значение true, поиск будет охватывать любой коллекции с именем «testing» на любой глубине ниже родительского .Так что не только /testing, но и что-то вроде /widgets/foo/testing Однако для выполнения этого запроса требуется то, что мы называем индексом "группы сбора", как указано в сообщении об ошибке.Прямо сейчас у вас нет возможности создать такой индекс, поэтому я сказал выше, что этот параметр в основном бесполезен.

Как мы уже говорили на некоторых других форумах, мы намерены выпустить этоттип запроса в будущем, в этом случае параметр allDescendants будет более полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...