Перечисление всех неподдерживаемых существующих подкадров [duplicate]

Скажем, у меня есть эта минимальная база данных, хранящаяся в Cloud Firestore. Как я мог получить имена subCollection1 и subCollection2?

rootCollection {
    aDocument: {
        someField: { value: 1 },
        anotherField: { value: 2 }
        subCollection1: ...,
        subCollection2: ...,
    }
}

Я ожидал бы, что вы сможете просто прочитать идентификаторы от aDocument, но только поля появляются, когда я get() документ.

rootRef.doc('aDocument').get()
  .then(doc =>

    // only logs [ "someField", "anotherField" ], no collections
    console.log( Object.keys(doc.data()) )
  )
4
задан 1 December 2017 в 07:52

3 ответа

Похоже, что они добавили метод с именем getCollections() в Node.js:

firestore.doc(`/myCollection/myDocument`).getCollections().then(collections => {
  for (let collection of collections) {
    console.log(`Found collection with id: ${collection.id}`);
  }
});

В этом примере выводятся все подкомпоны документа в /myCollection/myDocument

0
ответ дан 15 August 2018 в 16:39
  • 1
    Это выглядит многообещающе. Из-за этой проблемы мне пришлось отказаться от использования Firestore, и у меня не было возможности дать ему еще одну попытку. Надеюсь, мой вопрос привел к лучшему опыту для других. И если это будет исправлено, как вы полагаете, я надеюсь, что у меня будет возможность попробовать его снова. – skylize 6 February 2018 в 08:36

В Node.js вы будете следовать методу ListCollectionIds

var firestore = require('firestore.v1beta1');

var client = firestore.v1beta1({
  // optional auth parameters.
});

// Iterate over all elements.
var formattedParent = client.anyPathPath("[PROJECT]", "[DATABASE]", "[DOCUMENT]", "[ANY_PATH]");

client.listCollectionIds({parent: formattedParent}).then(function(responses) {
    var resources = responses[0];
    for (var i = 0; i < resources.length; ++i) {
        // doThingsWith(resources[i])
    }
})
.catch(function(err) {
    console.error(err);
});

. В настоящее время это не поддерживается в клиентских SDK (в Интернете, iOS, Android).

3
ответ дан 15 August 2018 в 16:39
  • 1
    Не совсем хорошие новости, но, по крайней мере, это происходит. Спасибо за обновление. Любые предложения по имеющимся в настоящее время методам рекурсивного удаления документов с субколлекциями? – skylize 6 October 2017 в 04:59
  • 2
    @Dan McGrath Является ли firestore просто облачным хранилищем данных? – Dimu Designs 6 October 2017 в 05:02
  • 3
    @skylize - & gt; Запустите функцию облака, чтобы выполнить ее. – Dan McGrath 6 October 2017 в 05:06
  • 4
    @DimuDesigns - & gt; Нет. – Dan McGrath 6 October 2017 в 05:07
  • 5
    @Dan McGrath Как срабатывает функция облачной функции? Вы говорите, что ListCollectionIds доступен сейчас в облачных функциях? – skylize 6 October 2017 в 05:12

Разве это не указано в документации?

/**
 * Delete a collection, in batches of batchSize. Note that this does
 * not recursively delete subcollections of documents in the collection
 */
function deleteCollection(db, collectionRef, batchSize) {
    var query = collectionRef.orderBy('__name__').limit(batchSize);

    return new Promise(function(resolve, reject) {
        deleteQueryBatch(db, query, batchSize, resolve, reject);
    });
}

function deleteQueryBatch(db, query, batchSize, resolve, reject) {
    query.get()
        .then((snapshot) => {
            // When there are no documents left, we are done
            if (snapshot.size == 0) {
                return 0;
            }

            // Delete documents in a batch
            var batch = db.batch();
            snapshot.docs.forEach(function(doc) {
                batch.delete(doc.ref);
            });

            return batch.commit().then(function() {
                return snapshot.size;
            });
        }).then(function(numDeleted) {
            if (numDeleted <= batchSize) {
                resolve();
                return;
            }

            // Recurse on the next process tick, to avoid
            // exploding the stack.
            process.nextTick(function() {
                deleteQueryBatch(db, query, batchSize, resolve, reject);
            });
        })
        .catch(reject);
}
-1
ответ дан 15 August 2018 в 16:39
  • 1
    Из всего кода, который вы разместили здесь, единственной частью, относящейся к моему вопросу, является комментарий вверху, «это не рекурсивно удаляет подколлекции документов в коллекции». Мой конкретный предполагаемый случай использования заключался в том, чтобы вручную перезаписать подколлекции, чтобы я мог удалить их, используя инструкции в документах. Однако по какой-то сумасшедшей причине я не могу получить список подколлекций, чтобы знать, что удалить. – skylize 5 December 2017 в 05:11
  • 2
    вы что-то поняли? – Bruno Braga 7 December 2017 в 23:39
  • 3
    doc.data().someField.subCollection1 или doc.data().someField.subCollection1.val() или doc.data().someField.subCollection1.val? – Ron Royston 7 December 2017 в 23:50

Другие вопросы по тегам:

Похожие вопросы: