Как создать индексы вложенных коллекций в Cloud Firestore?

я погуглил и проверил документацию Cloud Firestore и ничего не нашел о том, как объявить индексы вложенных коллекций. Я объявил нечто подобное

...{    
  "collectionId": "user/{uid}/feeds",
  "fields": [..]
}...

и на вкладке индексы он хранится следующим образом

__escuser~1{uid}~1feeds__

не знаю, правильно ли я его создал или нет.

2 ответов


когда вы идете, чтобы создать индекс, он фактически говорит вам запустить запрос, который вы хотите создать индекс один раз вручную, а затем он будет генерировать URL, который вы можете скопировать вставить в браузер и вуаля!

enter image description here

вот как вы это делаете:

  1. создать новый dir
  2. npm init
  3. npm i --save firebase-admin
  4. создать index.js
  5. поместите следующую функцию в документ

    const admin = require('firebase-admin');
    const serviceAccount = require('./firebase-creds.json');
    
    admin.initializeApp({
      credential: admin.credential.cert(serviceAccount),
      databaseURL: 'https://projectId.firebaseio.com'
    });
    
    function runQuery() {
      db
      .collection('users')
      .doc(someRandomUserId)
      .collection('feed')
      .where('read', '==', false)
      .where('timestamp', '<=', 1509889854742) //Or something else
      .get()
      .then(doc => {
        console.log(doc.data());
      })
      .catch(error => console.log(error));
    };
    runQuery();
    
  6. Run node index.js

это выплюнет что-то вроде этого:

{ Error: The query requires an index. You can create it here: https://console.firebase.google.com/project/project-projectID/database/firestore/indexes?create_index=longRandomString ...}

скопируйте ссылку и вставьте ее в браузер.

enter image description here

обновление

чтобы добавить индекс вручную (через CLI), вы можете сделать следующее:

{
  "indexes": [
    {
      "collectionId": "feed",
      "fields": [
        { "fieldPath": "read", "mode": "ASCENDING" },
        { "fieldPath": "timestamp", "mode": "ASCENDING" },
        ...
      ]
    }
  ]
}

или просто зайдите в админ панель в вашей базе данных и добавьте индекс для кормов там.


на это, похоже, отвечает @michael-bleigh здесь:https://stackoverflow.com/a/47165007/2511985

индексы Cloud Firestore основаны на названия, а не полные пути сбора. Поэтому, если вы хотите создать индексы на users/{id}/messages правильный способ сделать это, чтобы создать индекс messages.