好的,我在Cloud Firestore中具有以下结构:
Collection question:
- userID
- text
and Collection user:
- name
- key
我可以轻松地从数据库中检索问题数据并将其返回,但是目前没有用户数据。他们我需要在数据库中再次搜索先前返回的每个注释。但是,尝试执行此操作时遇到很多问题。
第一:
我这样做是为了搜索问题:
组件:
export class ListQuestionsComponent implements OnInit {
tableData: Question[] = [];
userData: User[] = [];
constructor(
private questionService: QuestionService,
private userService: UserService,
) { }
ngOnInit() {
this.loadItens();
this.getUsers();
}
loadItens() {
this.questionService.loadItems().subscribe(response => {
this.tableData = [];
for (const item of response) {
this.tableData.push(item.payload.doc.data() as Question);
}
}
问题服务:
loadItems() {
const query = ref => ref
.limit(10);
return this.firestore.collection('perguntas', query).snapshotChanges();
}
这有效,现在我的tableData中有问题。现在,我需要搜索用户以查找每个问题。
我尝试在同一组件中执行此操作:
getUsers() {
for(const item of this.tableData) {
this.userService.getUserByKey(item.userID).subscribe(response => {
this.userData = [];
for (const user of response) {
this.userData.push(user.payload.doc.data() as User);
}
});
}
}
用户服务
getUserByKey(key: string) {
return this.firestore.collection('users', ref => ref
.where('key', '==', key))
.snapshotChanges();
}
最后,我有一个tableData包含10个问题,而userData没有任何内容。我现在不知道该怎么办。我只需要我所寻求的问题中引用的用户。
答案 0 :(得分:0)
有很多方法,我在Firestore中采用的方法是将我认为需要的数据与要提取的数据一起存储。
因此,如果我要提取questions
,并且知道需要user
,他们的username
和他们的profile picture
,那么我将在其中存储用户字段每个具有用户ID,用户名和个人资料图片的问题文档。
类似的东西:
Questions:
---> Question
---> Date
---> User:
-------> ID
-------> Profile Picture
-------> Username
更新:
您需要做出决定的事情是有多少用户数据可以保持最新状态,以及哪些数据位需要保持更新。对于需要保持更新的任何内容(例如可能影响路由的用户名),您可以侦听核心用户集合的更改:
exports.updateUser = functions.firestore
.document('user/{userId}')
.onUpdate((change, context) => {
const newValue = change.after.data();
const previousValue = change.before.data();
const newName = newValue.name;
const oldName = previousValue.name;
if (newName !== oldName){
//update all questions where userId matches.
}
// perform other desired operations ...
});
有关云功能的更多信息,请参见文档的此部分:https://firebase.google.com/docs/functions/firestore-events#trigger_a_function_when_a_document_is_updated
答案 1 :(得分:0)
好吧,对异步功能进行一些研究已经取得了一些成果。我更改了代码中的某些内容。
可变的用户数据变为
userData:任意;
在我的 loadItems()订阅中,我致电 getUsers()
和我的 getUsers()
getUsers() {
for (const item of this.tableData) {
this.usuarioService.getUserByKey(item.userId).subscribe(response => {
this.userData[item.userId] = response[0].payload.doc.data();
});
}
}