如何将Firestore中的现有集合/数据移动到子集合?



在我的firestore数据库中,我有以下用文档填充的db模式

root
|
|---transactions/...

我想将所有事务移动到一个新的子集合,如:

root
|
|---users/user/transactions/...

我如何做到这一点?

在尝试了几种方法(见下文)之后,以下是对我有效的方法:

1。使用@angular/fire SDK使用自定义函数迁移数据:

// firebase.service.ts
import { Injectable } from '@angular/core';
import { AngularFirestore } from '@angular/fire/firestore';
import { first, map } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
})
export class FirebaseService {
fromCollection = '<name-of-collection>';
toCollection = '<other-root-level-collection>/<document-id>/<subcollection>';
constructor(private firestore: AngularFirestore) {}
migrateTransactions() {
this.getAllDocuments<YourType>(this.fromCollection).subscribe((documents) => {
documents.forEach(async (document) => {
await this.createDocument(this.toCollection, document);
});
});
}
getAllDocuments<T>(path: string) {
return this.firestore
.collection(path)
.get()
.pipe(
first(),
map((collection) => collection.docs.map((doc) => doc.data() as T))
);
}
createDocument(path: string, document: unknown) {
return this.firestore.collection(path).add(document);
}
}

注意:这只会将原始文档中的所有文档添加到目标集合中——它不会删除原始文档或覆盖任何现有文档,因此使用起来非常安全。之后,您可以在Firebase控制台中删除原始集合。

请记住,您可以连接嵌套集合和文档,并将其作为参数传递给AngularFirestore.collection(path)(如属性toCollection中所示)。这使得遍历嵌套集合变得容易。我不知道这在其他sdk中是否可能。

2。使用firestore-migrator进行迁移:

这对我不起作用,因为库在转换firebase的时间戳时失败了。如果您的模式中没有任何复杂的数据类型,那么它可能会起作用。这个库本身是一个很好的实用程序,如果你愿意做一点修改,它可以在本地工作。

3。使用Cloud Firestore管理的导出和导入服务进行迁移:

这只适用于整个数据库或根级集合的完整备份。所以这可能不是你想要的。

相关内容

  • 没有找到相关文章

最新更新