如何在Cloud Firestore中执行嵌套查询?

时间:2019-09-17 19:52:08

标签: angular firebase google-cloud-firestore

我需要执行一个包含事件数组的数据库请求,其中每个事件都具有报告者的ID。因此,在返回事件数组之前,我需要将相应的用户映射到相应的事件。查询应如下所示: 1.查询集合('/事件) 2.最终返回该事件,但在返回之前 ->浏览该事件数组中的每个条目,并查询该事件的适当报告者。将那个记者指派给该事件,然后返回整个数组。

所以我搜索的结果看起来像这样: -发生火灾的事件具有以下属性:

Incident: {
 id: string;
 likes: number;
 reportedBy: string;
}
    我要显示的
  • 事件:
Incident: {
 id: string;
 likes: number;
 reportedBy: User;
}

有人对我有答案吗?几天以来我一直在寻找解决方案...

2 个答案:

答案 0 :(得分:0)

我对另一个问题here发表了类似的答案:

在我看来,没有什么理由在客户端进行通话。 Firestore的速度非常快,但在可能的情况下也可以拨打更少的电话。我在Firestore中采用的技术是将我认为需要的数据与要提取的数据一起存储。

因此,如果我要提取incidents,并且知道需要user,他们的username和他们的profile picture,那么我将在其中存储用户字段每个具有用户ID,用户名和个人资料图片的问题文档。

类似的东西:

Incidents:
---> Incident
---> Date
---> ReportedBy:
-------> 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 incidents 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)

Firestore现在支持嵌套查询。据我了解,您想搜索“事件”集合,然后为每个事件分配其报告者。根据官方文档中的example,您可以使用get()从集合中获取所有文档。

db.collection("incidents").get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
// fetching reportedBy info using .get field.
    console.log(doc.get(“reportedBy”));
    });
});

让我知道这是否有帮助。