NodeJS 获取文档ID的更好方法,该ID是自动生成的,用于创建文档或更新文档Firestore / Firebase内的数组

bq3bfh9z  于 2022-12-12  发布在  Node.js
关注(0)|答案(1)|浏览(172)

我正在为每个用户创建一个文档来存储用户书签的ID。我正在使用addDoc,所以创建的文档的ID是由firebase生成的。我想检查该文档是否存在,以便创建新文档或更新旧文档。我需要有一个文档引用来更新文档,我花了很长时间试图找到一种方法来获得自动生成的ID。我的代码可以工作,但感觉很糟糕--有没有更好的方法来完成这个任务?

//Add a value to the bookmarks array for individual user
export const addBookmarkForUser = async (userAuth, showId) => {
  const bookmarkDocRef = collection(db, 'users', userAuth.uid, 'bookmarks')
  const bookmarkSnapshot = await getDocs(bookmarkDocRef)
  let userBookmarkDocId
  if(bookmarkSnapshot){   
    bookmarkSnapshot.forEach((doc) => {
      if(doc.id){
        userBookmarkDocId = doc.id
        console.log(userBookmarkDocId)
      }
    })    
  }  
  try {    
    if(!bookmarkSnapshot) {
      await addDoc((collection(db, 'users', userAuth.uid, 'bookmarks'), {
        favorites: [{showId: showId}],
      }))
    }else {
      const userBookmarkRef = doc(db, 'users', userAuth.uid, 'bookmarks', userBookmarkDocId)
      await updateDoc(userBookmarkRef, {
        favorites: arrayUnion({showId: showId})
      })}
    
  } catch (error) {
    console.log('Error creating bookmark', error.message);
  }
};

我知道每个用户只有一个文档-是否有更好的方法来查找doc.id?
下面是firestore结构-x1c 0d1x

0s7z1bwu

0s7z1bwu1#

如果您只想检查集合中有多少文档,那么您可以使用getCountFromServer()来加载计数,而不加载实际的文档数据。

import { collection, getCountFromServer } from 'firebase/firestore';

const bookmarkColRef = collection(db, 'users', userAuth.uid, 'bookmarks');
const bookmarksCount = (await getCountFromServer(bookmarksColRef)).data().count

console.log(`${bookmarksCount} documents found in ${bookmarksColRef.path}`)\

if (!bookmarksCount) {
  // no document exists, create new 
}

但是,由于您需要文档ID及其数据,因此可以运行一个简单的查询:

import { collection, getDocs } from 'firebase/firestore';

const bookmarkColRef = collection(db, 'users', userAuth.uid, 'bookmarks');
const bookmarksSnap = await getDocs(bookmarksColRef);

if (bookmarksSnap.empty()) {
  // no document
} else {
  const docData = bookmarksSnap.docs[0].data();
  console.log(docData)
}

相关问题