【问题标题】:Get data nested in array with firebase使用firebase获取嵌套在数组中的数据
【发布时间】:2020-08-03 09:55:56
【问题描述】:

我在从 Firebase 的聊天网络应用中获取数据时遇到问题。 我正在使用 Firebase 函数和打字稿。

我在我的聊天对象中存储了一些关于发件人和收件人的信息,如下所示:

chats: {
   :chatId: {
       users: {
          userNames: ["senderName", "recipientName"]
          userIds: ["senderId", "recipientId"]
       }
   }
}

现在,我正在尝试编写一个函数来检索所有聊天,其中发出请求的用户的 userId 存储在 userIds 对象中。

我的打字稿函数如下所示:

export const getUserChats=functions.https.onRequest((req:PR_UserRequest, res: Response) => {

    let chatsData: DocumentData[] = [];

    db.collection("chats").where("usersIds", "array-contains", `${req.user?.userId}`).get()
        .then((chats) => {

            chats.forEach((doc) => chatsData.push(doc.data()))
            res.json(chatsData);

        })
})

结果:

[]

我正在获取聊天集合并使用 where 方法对其进行过滤,但似乎没有找到 userIds 数组。事实上,该函数返回一个空的“聊天”数组。

预期结果:

{
    users: {
        userNames: ["senderName", "recipientName"]
        userIds: ["senderId", "recipientId"]
    }
    ...other data
}

我应该怎么做才能得到正确的结果?

提前致谢。

【问题讨论】:

  • 嘿@Francesco Bollini,如果我错了,请纠正我。您在这里有一个名为“chats”的集合,其中包含带有 chatid 的文档,并且在每个文档中都有用户对象。这个用户对象有两个属性 userNames 和 userIds,你想创建一个函数来获取调用者在这些聊天中记录的所有聊天吗?
  • 是的,我正在努力得到这个结果。
  • 正如我所见,您正在尝试按“userIds”进行过滤,这不是您的 chatId 文档中的字段,并且这在 Firestore 中是不可能的,因为您只能按字段进行过滤。所以在这里你只能按“用户”字段过滤。您可以在当前数据模式中做的唯一一件事是获取所有聊天并在前端进行过滤。您可以做的其他事情是更改您的架构,以便它适合您的用例,即您的 chatid 文档应该具有用户字段,这是一个用户 ID 数组,这样您就可以使用“array-contains”方法仅获取包含的文档这个用户名
  • 我已经发布了答案。如果它有助于解决您的问题,请接受它。这也将有助于社区

标签: typescript google-cloud-firestore google-cloud-functions


【解决方案1】:

正如我所见,您正在尝试按“userIds”进行过滤,这不是您的 chatId 文档中的一个字段,而且这在 Firestore 中是不可能的,因为您只能按字段进行过滤。所以在这里你只能按“用户”字段过滤。您可以在当前数据模式中做的唯一一件事是获取所有聊天并在前端进行过滤。您可以做的其他事情是更改您的架构,以便它适合您的用例,即您的 chatid 文档应该具有用户字段,这是一个用户 ID 数组,这样您就可以使用“array-contains”方法仅获取包含的文档这个用户名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多