Как заказать комментарии в firebase firestore с помощью createdAt

У меня есть документ, в котором есть массив комментариев объектов, и каждый объект имеет свойство createdAt. Я хочу отсортировать все комментарии, которые находятся внутри массива комментариев, используя свойство createdAt, поэтому новый комментарий будет вверху.

Я провел некоторое исследование и обнаружил, что мы можем сделать это в база данных Firebase в реальном времени, но я хочу упорядочить данные с помощью firestore.

Вот мой код:

import { useEffect, useRef, useState } from "react"
// firebase import
import { doc, onSnapshot, orderBy, query } from "firebase/firestore"

import { db } from "../firebase/config"

export const useDocument = (c, id, o) => {
  const [document, setDocument] = useState(null)
  const [error, setError] = useState(null)

  // realtime document data
  useEffect(() => {
    let docRef = doc(db, c, id)

    if (o) {
      docRef = query(docRef, orderBy("createdAt", "desc")) // this is not working
    }

    const unsubscribe = onSnapshot(
      docRef,
      (snapshot) => {
        // need to make sure the doc exists & has data
        if (snapshot.data()) {
          setDocument({ ...snapshot.data(), id: snapshot.id })
          setError(null)
        } else {
          setError("No such document exists")
        }
      },
      (err) => {
        console.info(err.message)
        setError("failed to get document")
      }
    )

    // unsubscribe on unmount
    return () => unsubscribe()
  }, [c, id])

  return { document, error }
}

свойство createdAt: Как заказать комментарии в firebase firestore с помощью createdAt

Почему вы используете doc()? Doc ссылается на один документ, возвращая DocumentReference. Итак, ваш snapshot.size равен 1 - заказывать нечего. Заказ CollectionReference в query будет работать, как и ожидалось.

Bob Massarczyk 07.05.2022 08:16

«У меня есть документ, в котором есть массив комментариев объектов, и каждый объект имеет свойство createdAt». -> означает ли это, что ваши комментарии не являются документами в (под) коллекции, а являются полем в одном документе?

Bob Massarczyk 07.05.2022 08:20

да! У меня есть комментарии как поле (массив объектов комментариев) в документе, это не отдельный документ или подколлекция.

r007 07.05.2022 08:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция query() принимает в качестве параметра запрос, а не DocumentReference. Также предложение документы заказовorderBy() при выборке нескольких документов из коллекции, а не элементов массива.

Чтобы упорядочить элементы массива, вам сначала нужно получить этот документ, а затем вручную отсортировать массив.

const unsubscribe = onSnapshot(
  docRef,
  (snapshot) => {
    // need to make sure the doc exists & has data
    if (snapshot.data()) {
      const orderedArray = snapshot.data().comments.sort((a, b) => a.createdAt.seconds - b.createdAt.seconds);
    } else {
      setError("No such document exists")
    }
  }
)

Я получаю это сообщение об ошибке TypeError: a.createdAt.getTime is not a function

r007 07.05.2022 08:44

@ r007 вы уверены, что поле createdAt присутствует во всех элементах массива? Попробуйте использовать a.createdAt?.getTime()

Dharmaraj 07.05.2022 08:47

да! У меня есть поле createdAt во всех элементах массива. Я также пробовал это ?., но все равно получил ту же ошибку. Я приложил скриншот объекта createdAt, пожалуйста, проверьте.

r007 07.05.2022 09:51

@ r007 да, это Временная метка пожарного магазина, я это пропустил. Попробуйте a.createdAt.seconds - b.createdAt.seconds

Dharmaraj 07.05.2022 10:08

Другие вопросы по теме