programing

소방서:문서 배열의 항목별 쿼리

showcode 2023. 6. 14. 22:02
반응형

소방서:문서 배열의 항목별 쿼리

"사진""사용자" 두 개의 컬렉션이 있으며 "사용자"의 각 문서에는 배열이 있는 하나 이상의 사진 ID가 있습니다.

photos > 5528c46b > name: "Photo1"
         a1e820eb > name: "Photo2"
         32d410a7 > name: "Photo3"
users > acd02b1d > name: "John", photos: ["5528c46b"]
        67f60ad3 > name: "Tom", photos: ["5528c46b", "32d410a7"]
        7332ec75 > name: "Sara", photos: ["a1e820eb"]
        9f4edcc1 > name: "Anna", photos: ["32d410a7"]

하나 이상의 특정 사진 ID를 가진 모든 사용자를 불러오고 싶습니다.

그것을 할 수 있는 방법이 있습니까?

Array Contains 쿼리를 사용할 수 있도록 설정하지 않았기 때문에 Henry의 답변을 참조하십시오.

아쉽게도 아직은 아닙니다. 로드맵에 나와 있지만요.

그 동안에는 다음과 같은 형태의 지도를 사용해야 합니다.

photos: {
    id1: true
    id2: true
}

이제 다음을 기준으로 필터링하여 ID가 1인 모든 사용자를 찾을 수 있습니다.photos.id1 == true.

이러한 집합을 쿼리하는 방법에 대한 자세한 내용은 Firebase 설명서를 참조하십시오.

배열 필드에 특정 요소가 포함된 문서를 찾기 위해 .where()와 함께 사용할 'array-contains' 쿼리 연산자가 추가되었습니다.

https://firebase.google.com/support/release-notes/js 5.3.0

업데이트: 에서도 사용할 수 있습니다.@google-cloud/firestore: https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0

업데이트 2 https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

업데이트 3은 이제 관리 노드.js SDK v6.0.0 https://github.com/firebase/firebase-admin-node/releases 에서 사용할 수 있습니다.

다음은 각 키에 대한 인덱스를 만들어야 하는 것에 대해 혼동하는 것처럼 보이기 때문에 답변에 대한 약간의 확장입니다. Firestore는 이미 간단한 쿼리를 위해 데이터를 인덱싱하므로 다음과 같은 간단한 쿼리를 수행할 수 있습니다.

documentReference.where('param','==','value').onSnapshot(...)

그러나 복합 쿼리는 해당 매개 변수에 대한 데이터를 인덱싱하지 않는 한 수행할 수 없습니다.따라서 다음과 같은 작업을 수행하려면 인덱스가 필요합니다.

 documentReference.where('param','==','value').where(..otherparams...).onSnapshot(...)

그래서 당신이 ID를 위해 사진이 필요하다면 당신은 그것들을 저장할 수 있습니다.

usersCollection :                        (a collection)
    uidA:                                (a document)
         photoField:                     (a field value that is a map or object)
            fieldID1 : true              (a property of the photoField)
            fieldID2 : true              (a property of the photoField)
            etc ...  

그리고 필드가 있는 사용자에게 간단히 질문할 수 있습니다.아래 쿼리와 같이 인덱스를 구성할 필요 없이 photoField의 ID1.

firestore.doc('usersCollection/uidA').where('photoField.fieldID1','==',true).onSnapshot(...)

파이어스토어는 2019년 11월 현재 'in' 쿼리를 추가했습니다.발표 기사에 따르면:

in 쿼리를 사용하면 단일 쿼리에서 여러 값(최대 10개)에 대해 특정 필드를 쿼리할 수 있습니다.검색할 모든 값을 포함하는 목록을 전달하면 Cloud Firestore는 필드가 해당 값 중 하나인 모든 문서와 일치합니다.

Firebase Version 9(2021년 12월 업데이트)

"while()"에서 단일 사진 문서 ID와 함께 "array-contains"를 사용하여 사진 문서 ID를 가진 모든 사용자를 가져올 수 있습니다.

import {
  query,
  collection,
  where,
  getDocs
} from "firebase/firestore";

// Here
const q = query(
  collection(db, "users"),
  where("photos", "array-contains", "5528c46b")
);
// Here

const usersDocsSnap = await getDocs(q);

usersDocsSnap .forEach((doc) => {
  console.log(doc.data()); // "John's doc", "Tom's doc"
});

"array-contains-any"를 "while()"배열이 있는 하나 이상의 사진 문서 ID와 함께 사용하여 더 많은 해당 사용자를 가져올 수도 있습니다.

import {
  query,
  collection,
  where,
  getDocs
} from "firebase/firestore";

// Here
const q = query(
  collection(db, "users"),
  where("photos", "array-contains-any", ["5528c46b", "a1e820eb"])
);
// Here

const usersDocsSnap = await getDocs(q);

usersDocsSnap .forEach((doc) => {
  console.log(doc.data()); // "John's doc", "Tom's doc", "Sara's doc"
});

언급URL : https://stackoverflow.com/questions/46849222/firestore-query-by-item-in-array-of-document

반응형