尝试获取Cloud Firestore数据时遇到问题

时间:2019-09-15 22:18:56

标签: angular typescript firebase google-cloud-firestore

好的,我在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没有任何内容。我现在不知道该怎么办。我只需要我所寻求的问题中引用的用户。

2 个答案:

答案 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();
    });
  }
}