Cloud Firestoreに登録されたデータをtimestamp順に取得する
序章
Firebaseのサービス「Cloud Firestore」にデータを記録し、そこから取得したデータを表示するWebサイトを作りました。単純に取得して表示したところ、登録順にデータは表示されず、謎の順番で表示されてしまうのでした。
原因
FirebaseのCloud Firestoreでは、addDoc()
メソッドを使用してデータを追加すると、ユニークなランダムなIDが自動的に割り当てられているようで、そのユニークなID順で表示されている模様。
解決方法
Firestoreのドキュメントに特定のフィールドを追加し、そのフィールドを使用してデータをソートする事で解決します。
具体的な解決コード
const [posts, setPosts] = useState([]); useEffect(() => { const postData = collection(db, "posts"); const queryRef = query(postData, orderBy("timestamp")); getDocs(queryRef).then((querySnapshot) => { const data = querySnapshot.docs.map((doc) => ({ ...doc.data() })); setPosts(data); });
query()を使い、第2引数でtimestampを指定してソートします。
const queryRef = query(postData, orderBy("timestamp"));
gueryRefからドキュメント一覧を取得し、querySnapshotに格納します。
getDocs(queryRef).then((querySnapshot) => {
querySnapshotから一つ一つドキュメントデータを取得し、dataに格納します。
const data = querySnapshot.docs.map((doc) => ({ ...doc.data() }));
上記の流れで無事タイムスタンプ順にデータを取得できました。
追記
import { collection, getDocs, addDoc, Timestamp, onSnapshot, doc, query, orderBy, } from "firebase/firestore";
importを忘れずに!