Получение всех данных в сборе в Firestore на NodeJS - PullRequest
0 голосов
/ 12 декабря 2018

Я сейчас использую Firestore и отвечаю на некоторые вопросы, на которые не могу найти ответ.

У меня есть следующие настройки коллекций / документов:

* client (collection)
  - client1 (document)
    [...]
  - client2 (document)
      name: placholder
      projectId: 1234
      url: string
      * apiKeys (collection)
        - platform1 (document)
          name: name
          key: key
        - platform2 (document)
          name: name
          key: key

ЧтоЯ хотел бы сделать, это получить полную коллекцию со всеми ее документами и подколлекциями.В конце концов, моя цель - сохранить его в таком объекте:

"client": {
    "client1": {...},
    "clinet2": {
        "name": "name",
        "projectId": 1234,
        "url": "http://localhost:5001",
        "apiKeys": {
            "platform1": {
                "name": "name",
                "apiKey": "key"
            },
            "platform2": {
                "name": "name",
                "apiKey": "key"
            }
        }
    }
}

Возможно ли это даже в Firestore?И если да, как я смогу это сделать (желательно без зацикливания и получения всего отдельно)?Любой учебник, документация или существующий код будет принята с благодарностью!

Спасибо, Ян

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Спасибо Рено Тарнеку за ответ.Я написал некоторый код для получения данных.Он просто проходит по всем коллекциям, получает все документы в нем, проходит по всем коллекциям в них и получает все документы из этой второй коллекции.Он сохраняет его в глобальной переменной.

Код мог бы быть лучше, но пока все хорошо!

Если у вас есть какие-либо вопросы, дайте мне знать.

clients = db.collection('client')

global.config.client = {}

// We're gonna get all clients and their config files.   
// Very shitty way to do this, but cloudFirestore does not allow us to fetch a whole collection as an object.
// Looping the main client collection, getting all documents, looping over all collections in those also getting all documents.
// Asked on StackOverflow, see: /12104372/poluchenie-vseh-dannyh-v-sbore-v-firestore-na-nodejs#12104373
clients.get()
//Get all documents in Client
.then(documents => {
    documents.forEach(doc => {
        // Loop over all documents found in Client
        global.config.client[doc.id] = doc.data()

        clients.doc(doc.id).getCollections()
            //List all collections in the document
            .then(collection => {
                // Loop over all found collections
                collection.forEach(col => {
                    // Get all documents in found collection
                    console.log(doc.id, col.id)
                    clients.doc(doc.id).collection(col.id).get()
                        .then(documentsDeep =>
                            documentsDeep.forEach(docD => {
                                global.config.client[doc.id][col.id] = {
                                    [docD.id]: docD.data()
                                }
                                console.log(docD.id)
                            }))
                        .catch(err => {
                            console.log(logMarkup, 'Error getting documents (global.config.client.settings)', err);
                        });
                })
            })
            .catch(err => {
                console.log(logMarkup, 'Error getting documents (global.config.client.settings)', err);
            });
    })
})
.catch(err => {
    console.log(logMarkup, 'Error getting documents (global.config.client.settings)', err);
});   
0 голосов
/ 12 декабря 2018

В настоящее время нет способа сделать это "без зацикливания и получения всего по отдельности" в Node.js.

Вам необходимо:

  1. Зацикливать свою коллекцию клиентов с помощьюиспользуя методы get() и forEach(), как показано здесь: https://firebase.google.com/docs/firestore/query-data/get-data#get_all_documents_in_a_collection
  2. Для каждого клиентского документа выполните один и тот же цикл для своей коллекции apiKeys.

Вам следуетвероятно, используйте Promise.all() для параллельного выполнения различных асинхронных операций get().


Одно небольшое преимущество, которое вы можете получить, используя Node.js по сравнению со стандартной библиотекой JavaScript, заключается в том, что вы можете перечислитьвложенные коллекции ссылки на документ с помощью метода getCollections() (который недоступен для Web / JavaScript).Но поскольку ваша apiKeys коллекция, кажется, имеет известное имя, это не приносит никакой реальной разницы.

...