在 Cloud Firestore 中更新集合名称
Posted
技术标签:
【中文标题】在 Cloud Firestore 中更新集合名称【英文标题】:Updating a collection name in Cloud Firestore 【发布时间】:2019-02-14 12:52:00 【问题描述】:我们可以更改 Cloud Firestore 中集合的名称吗?我创建了一个包含 200 个文档的集合。现在我想更改集合的名称。在 Firebase 控制台中,我找不到执行此操作的方法。
是否可以通过代码或在控制台中更改集合的名称。或者是否可以从 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你可以试试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 以获取子集合。非常感谢你们!以上是关于在 Cloud Firestore 中更新集合名称的主要内容,如果未能解决你的问题,请参考以下文章
如何按创建日期而不是名称对 Cloud Firestore 集合中的文档进行排序?
如何为 Firestore 数据库的 Cloud Functions 中的每个集合插入、更新添加时间戳
Firestore / Cloud功能 - 如何在更改时更新Firestore数据