在我的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管理的导出和导入服务进行迁移:
这只适用于整个数据库或根级集合的完整备份。所以这可能不是你想要的。