Получить данные, вложенные в массив, с помощью firebase - PullRequest
1 голос
/ 03 августа 2020

У меня проблемы с получением данных в моем веб-приложении чата из 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
}

Что мне делать, чтобы получить правильный результат?

Заранее спасибо.

1 Ответ

0 голосов
/ 05 августа 2020

Как я вижу, вы пытаетесь выполнить фильтрацию по «userIds», которая не является полем в вашем документе chatId, и это невозможно в firestore, поскольку вы можете фильтровать только по полям. поэтому здесь вы можете фильтровать только по полю «пользователи». Единственное, что вы можете сделать в своей текущей схеме данных, - это получить все чаты и отфильтровать их во внешнем интерфейсе. Еще вы можете изменить схему так, чтобы она соответствовала вашему варианту использования, т.е. в вашем документе chatid должны быть поля пользователей, которые представляют собой массив идентификаторов пользователей, и таким образом вы можете использовать метод "array-contains" для извлечения только тех документов, которые содержат этот идентификатор пользователя

...