소방서:문서 배열의 항목별 쿼리
"사진"과 "사용자" 두 개의 컬렉션이 있으며 "사용자"의 각 문서에는 배열이 있는 하나 이상의 사진 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
'programing' 카테고리의 다른 글
Mongoose는 array.length가 0보다 큰 모든 문서를 찾고 데이터를 정렬합니다. (0) | 2023.06.19 |
---|---|
virtualenv 폴더를 중단하지 않고 이름 바꾸기 (0) | 2023.06.14 |
루비는 진짜 멀티스레딩이 있나요? (0) | 2023.06.14 |
분기 인식 프로그래밍 (0) | 2023.06.14 |
Wordpress URL의 슬래시 전달 (0) | 2023.06.14 |