source

Firestore - 문서에서 특정 필드 가져오기

manysource 2023. 6. 9. 22:07

Firestore - 문서에서 특정 필드 가져오기

필요한 것:

Firestore에서 해당 필드와 함께 기사 또는 노트를 저장하려고 합니다.

  • 제목
  • 내용(텍스트 또는 단락)
  • 작성일자
  • 소유자(다른 사람과 해당 기사를 공유하고 다음과 같이 편집할 수 있는 사용자: https://firebase.google.com/docs/firestore/solutions/role-based-access)

그러나 기사 목록을 표시할 때 대역폭을 절약하기 위해 "콘텐츠" 필드가 필요하지 않습니다.제가 잘못 읽었을 수도 있습니다. Firestore가 있는 문서에서 특정 필드만 가져오는 쿼리는 불가능합니다.

(내용 없이) 기사에서 특정 열을 가져오는 것이 정상 SQL인 경우이는 다음과 같습니다.

SELECT title, creation_date, ...
FROM table_name;

따라서 유연성과 확장성을 위해 두 개의 루트 레벨 컬렉션에 대한 컨텐츠를 분리하기로 결정했습니다.


내 현재 구조:

기사 모음:

  - `articles` [collection]
    - `ARTICLE_ID` [document]
      - `creatorId` [field]
      - `title` [field]
      - `date` [field]
      - `owners` [obj field]
          - {user1_id}: true
          - {user2_id}: true
          ...

컨텐츠 수집:

  - `contents` [collection]
    - `{ARTICLE_ID}` [document]
      - `content` [field]

기사 목록을 실시간으로 가져오는 방법

firebase.firestore().collection('articles')
  .where(`owners.${user.uid}`, '==', true)
  .onSnapshot(querySnapshot => {
    const articles = []
    querySnapshot.forEach((doc) => {
      articles.push({
        id: doc.id,
        ...doc.data()
      })
    })
    // do something with articles array
  })

다른 보기로 표시하고 해당 내용과 함께 전체 아티클을 가져오는 방법

const db = firebase.firestore()
const articleRef = db.collection('articles').doc(articleId)
const contentRef = db.collection('contents').doc(articleId) // same Id as article

articleRef.get().then(articleDoc => {
  if (articleDoc.exists) {
    contentRef.get().then(contentDoc => {
      if (contentDoc.exists) {
        const article = {
          ...articleDoc.data(),
          ...contentDoc.data()
        }
        // full article obj
      }
    })
  } 
})

나의 질문들

  • 저처럼 쿼리를 중첩하지 말고 동시에 두 개의 쿼리(GetArticle 및 getContent)를 수행하고 Promise.all()을 사용하여 기다리는 것이 더 낫다고 생각하십니까?

  • 하나의 쿼리로 기사와 내용을 효율적으로 가져올 수 있는 더 좋은 방법이 있습니까?팁이나 아이디어?

잘 부탁드립니다!

파이어스토어 쿼리에 따르면.원하는 필드를 선택할 수 있어야 하는 문서를 선택합니다.

let collectionRef = firestore.collection('col');
let documentRef = collectionRef.doc('doc');

return documentRef.set({x:10, y:5}).then(() => {
  return collectionRef.where('x', '>', 5).select('y').get();
}).then((res) => {
  console.log(`y is ${res.docs[0].get('y')}.`);
});

어느 접근법도 다른 접근법보다 지속적으로 좋지 않습니다.하지만 몇 가지 중요한 차이점이 있습니다.

  1. 읽기를 중첩하면 첫 번째 읽기가 완료된 후에만 두 번째 읽기가 시작됩니다.사용할 때Promise.all()두 개의 읽기가 동시에 시작되므로 병렬로 실행할 수 있습니다.

  2. 반면에: 사용할 때Promise.all()완료 핸들러(실행 중인 코드)then()두 문서가 로드될 때까지 실행되지 않습니다.호출을 중첩할 경우 첫 번째 문서가 로드된 후 UI를 업데이트할 수 있습니다.

결국, 차이는 작을 것 같습니다.그러나 사용 사례에 중요한 영향을 미칠 수 있으므로 결과를 측정하고 무엇이 가장 효과적인지 확인하십시오.

Firestore 문서(버전 9)에서 단일 필드(예: 문서 모음의 '제목')를 출력하려면 다음 코드 조각을 사용할 수 있습니다.

const q = query(collection(db, 'articles'))
let results = [];
await getDocs(q);
results = getLocation.docs.map((doc) => doc.data()['title']);
results.sort()

결과 배열에는 알파벳 순으로 정렬된 제목 필드만 포함됩니다(Firestore db를 참조하고 Firestore에서 'getDocs', 'query' 및 'collection' 모듈을 가져와야 합니다).

기사와 같은 정적 콘텐츠에는 Firebase Hosting이 가장 적합합니다.예를 들어 AMP-HTML을 보면 초고속 페이지 로드에 대한 근거를 제시하고 에지 캐싱의 이점을 강조합니다.Firebase 호스팅은 글로벌 에지 캐싱도 지원하도록 보급되었습니다.

Firestore 및 Firebase Realtime Database는 데이터베이스 엔진입니다.이것들은 기사를 제공하는 데 적합한 도구가 아닙니다.

언급URL : https://stackoverflow.com/questions/49483406/firestore-get-specific-fields-from-document