gpt4 book ai didi

firebase - 在 Cloud Firestore 中,为什么无法 "single bulk"删除集合(可以使用实时数据库)?

转载 作者:行者123 更新时间:2023-12-03 14:38:33 24 4
gpt4 key购买 nike

使用 Firebase 实时数据库,我们只需调用 remove () 即可使用一个命令删除大量项目。在父节点上(该节点被删除并且所有的都是子节点)。

但根据 Firestore ( https://firebase.google.com/docs/firestore/manage-data/delete-data#collections ) 的文档:
要删除一个集合,我们必须编写一个批处理,该批处理将遍历其所有文档并逐个删除它们。

这根本没有效率。是因为 Firestore 处于 beta 版本,还是在一次调用中删除完整节点(集合)在结构上是不可能的?

最佳答案

我很高兴从实时数据库重构我的 Firestore 应用程序,享受更短的代码和更简单的语法,直到我重构了 delete() 函数!要删除包含子集合的文档:

  • 创建一个 promise 数组。
  • get()一个子集合,没有进一步的子集合。
  • 遍历 forEach()函数读取子集合中的每个文档。
  • 删除每个文档,并将删除命令推送到 promise 数组中。
  • 继续下一个子集合并重复此操作。
  • 使用Promise.all(arrayOfPromises)等到所有子集合都被删除。
  • 然后删除顶级文档。

  • 对于多层集合和文档,您需要将其设为一个函数,然后从另一个函数调用它以获得下一个更高层,等等。

    您可以在控制台中看到这一点。要手动删除集合和文档,请删除最右侧的文档,然后删除最右侧的集合,依此类推。

    这是我在 AngularJS 中的代码。只有在子集合之前没有删除顶级集合时,它才有效。
    $scope.deleteClip = function(docId) {
    if (docId === undefined) {
    docId = $scope.movieOrTvShow + '_' + $scope.clipInMovieModel;
    }
    $scope.languageVideos = longLanguageFactory.toController($scope.language) + 'Videos';
    var promises = [];
    firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceTranslations').get()
    .then(function(translations) {
    translations.forEach(function(doc) {
    console.log(doc.id);
    promises.push(firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceTranslations').doc(doc.id).delete());
    });
    });
    firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceExplanations').get()
    .then(function(explanations) {
    explanations.forEach(function(doc) {
    console.log(doc.id);
    promises.push(firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).collection('SentenceExplanations').doc(doc.id).delete());
    });
    });
    Promise.all(promises).then(function() {
    console.log("All subcollections deleted.");
    firebase.firestore().collection($scope.languageVideos).doc($scope.movieOrTvShow).collection('Video Clips').doc(docId).delete()
    .then(function() {
    console.log("Collection deleted.");
    $scope.clipInMovieModel = null;
    $scope.$apply();
    })
    .catch(function(error) {
    console.log("Remove failed: " + error.message);
    });
    })
    .catch(function(error){
    console.log("Error deleting subcollections: " + error);
    });
    };

    在实时数据库中,所有这些都是一行。

    关于firebase - 在 Cloud Firestore 中,为什么无法 "single bulk"删除集合(可以使用实时数据库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46692845/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com