【问题标题】:Updating a collection name in Cloud Firestore在 Cloud Firestore 中更新集合名称
【发布时间】:2019-02-14 12:52:00
【问题描述】:

我们可以更改 Cloud Firestore 中集合的名称吗?我创建了一个包含 200 个文档的集合。现在我想更改集合的名称。在 Firebase 控制台中,我找不到执行此操作的方法。

是否可以通过代码或在控制台中更改集合的名称。或者是否可以从 Firestore 导出文档,创建一个新集合,然后再次导入这些文档?

请帮忙。

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    名称或 ID 或集合或文档一旦存在便无法更改。为了构建有效的索引,所有这些数据都是不可变的。

    您当然可以把所有内容都读出来,然后用新的名称和 ID 重新输入。

    【讨论】:

    • Firebase 实时数据库中有导出/导入选项,但 Firestore 没有。请纠正我,以防我在某处错过了它。在 Firestore 中导出文档还有其他选项吗?
    • @DougStevenson,据我了解,只能导入特定的集合,而不是文档,从而保留集合名称。是否可以将一个集合下的所有文档导入到 Firestore Db 中具有不同集合名称的另一个集合中?
    • @Sri 您可以使用Firebase import / export 将完整的 Firestore 数据库导出/导入到 GCP 存储桶中,然后手动(或通过脚本)更新导出并在更新后重新导入。
    • 不要将更改的 ID 与更改的集合名称放在同一个存储桶中。更改集合名称应该与索引无关。
    【解决方案2】:

    您可以加载它,然后用新名称重新上传它

          await FirebaseFirestore.instance
              .collection(oldCollectionName)
              .get()
              .then((QuerySnapshot snapShot) async {
            snapShot.docs.forEach((element) async {
              await FirebaseFirestore.instance
                  .collection(newCollectionName)
                  .doc(element.id)
                  .set(element.data());
            });
          });
    

    注意:以上代码是为 Flutter 编写的,但它可能对任何人稍加改动有所帮助。

    【讨论】:

    • 这不会移动任何子集合,对吧?只是为处于这种情况的人标记。
    • 还没有测试它是否存在子集合,但我认为它会起作用,因为子集合被认为是在“element.data()”中提到的数据中,对吧?那为什么不移动呢?如果有人可以测试它,我会很高兴。
    • 我试过了,但它一直显示这个错误“参数类型'对象?'当我要对其进行 SET 时,无法将其分配给参数类型“Map
    【解决方案3】:

    你可以试试Firefoo它允许你更改重命名、复制、导出等,但它不是免费的

    【讨论】:

      【解决方案4】:

      这是一段用 JavaScript 编写的代码。 请注意子集合不会被移动,并且之前的集合不会被销毁。

      const db = admin.firestore();
      const oldCollRef = db.collection('oldCollectionName');
      const oldCollSnap = await oldCollRef.get();
      let arrayPromise = [];
      oldCollSnap.forEach(async doc => {
          arrayPromise.push(new Promise(async (resolve, reject) => {
              resolve(await db.collection('newCollectionName').add(doc.data()));
          }));
      })
      Promise.all(arrayPromise)
      

      【讨论】:

      • 我使用@JeremyValensi 的上述解决方案为每个文档调用Andrey Lechev's solution 以获取子集合。非常感谢你们!
      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 2021-08-12
      • 2021-05-06
      • 2021-08-29
      • 2021-09-03
      相关资源
      最近更新 更多