или же

м, у меня есть эта минимальная база данных, хранящаяся в 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()) )
  )
 Victor Nascimento06 окт. 2017 г., 03:43
Разве коллекции не должны быть известны программисту заранее? Какой у вас вариант использования?
 Dimu Designs06 окт. 2017 г., 03:52
Подколлекции не являются членами / свойствами родительского документа, который используется для ссылки на них.
 Kato13 мар. 2019 г., 16:54
Рекурсивное удаление может быть сделано в Admin SDK и через CLI. См докВот.
 skylize06 окт. 2017 г., 03:52
@VictorNascimento. Вариант использования связан с отсутствием рекурсивного удаления. Я пытаюсь удалить документ с вложенными в него вложениями, и эти вложенные коллекции также следует удалить, поскольку они являются дочерними элементами документа и более не действительны. Да, в данный момент я знаю имена коллекций, но было бы ужасной практикой вручную перечислять каждую отдельную коллекцию на дереве потенциально бесконечной глубины, чтобы удалить только один документ.

Ответы на вопрос(3)

Разве это не подробно описано вдокументация?

/**
 * 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);
}
 skylize05 дек. 2017 г., 02:11
Из всего кода, который вы разместили здесь, единственная часть, относящаяся к моему вопросу, - это комментарий вверху: «это не рекурсивно удаляет вложенные коллекции документов в коллекции». Мой конкретный предполагаемый вариант использования состоял в том, чтобы вручную восстановить подколлекции, чтобы я мог удалить их, используя инструкции в документации. И все же по какой-то сумасшедшей причине я не могу получить список вложенных коллекций, чтобы знать, что удалять.
 Ron Royston07 дек. 2017 г., 20:50
doc.data().someField.subCollection1 или жеdoc.data().someField.subCollection1.val() или жеdoc.data().someField.subCollection1.val?
 Bruno Braga07 дек. 2017 г., 20:39
ты что-нибудь понял?

В 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 (Web, iOS, Android).

 skylize06 окт. 2017 г., 03:59
Не совсем хорошие новости, но, по крайней мере, они идут. Спасибо за обновления. Есть предложения по доступным в настоящее время методам рекурсивного удаления документов с вложенными коллекциями?
 Dan McGrath06 окт. 2017 г., 04:06
@skylize -> Запустить облачную функцию, чтобы выполнить ее.
 Dimu Designs06 окт. 2017 г., 04:02
@Dan McGrath Неужели пожарный магазин переименован в облачное хранилище данных?
 skylize06 окт. 2017 г., 04:12
@Dan McGrath Как может помочь запуск облачной функции? Ты говоришьListCollectionIds доступенв настоящее время в облачных функциях?
 Dan McGrath06 окт. 2017 г., 04:07
@DimuDesigns -> Нет.

что они добавили метод под названием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

 skylize06 февр. 2018 г., 05:36
Это выглядит многообещающе. Мне пришлось отказаться от использования Firestore из-за этой проблемы, и у меня не было возможности попробовать еще раз. Я надеюсь, что мой вопрос привел к лучшему опыту для других. И если это будет исправлено, как вы предлагаете, то я надеюсь, что у меня будет шанс попробовать это снова.

Ваш ответ на вопрос