Firebase Firestore 'Reference' 데이터 유형은 무엇에 유효합니까?
새로운 Firebase Firestore를 탐색하는 중인데 데이터 유형인 "라고 합니다.이것이 무엇을 하는지 내게는 명확하지 않다.
- 외국 열쇠 같아요?
- 다른 곳에 있는 컬렉션을 가리키는 데 사용할 수 있습니까?
- if
reference
실제 레퍼런스입니다.의에사 사용 ??? ???예를 들어 텍스트 필드에 userId를 저장하지 않고 사용자를 직접 가리키는 참조를 가질 수 있습니까?그리고 이 사용자 레퍼런스를 쿼리에 사용할 수 있습니까?
아래에 Firestore의 레퍼런스를 사용하여 나에게 효과가 있었던 것을 추가한다.
다른 답들도 그렇듯이 외국 열쇠 같아요.그러나 참조 속성은 참조 문서의 데이터를 반환하지 않습니다.예를 들어, 제품의 속성 중 하나로 userRef 참조가 포함된 제품 목록이 있습니다.제품 목록을 가져오면 해당 제품을 만든 사용자를 참조할 수 있습니다.하지만 그 참조에 있는 사용자의 자세한 내용은 알 수 없습니다.이전에도 포인터가 있는 서비스로 다른 백엔드를 사용한 적이 있습니다.이 백엔드는 사용자의 참조 ID뿐만 아니라 사용자의 상세 정보를 반환하는 "pulate: true" 플래그가 붙어 있습니다.이 플래그를 사용하면 (향후 개선되는 것이 바람직합니다.
아래는 참조 설정, 제품 목록 수집 및 사용자 참조 ID에서 사용자 상세 정보를 얻기 위해 사용한 코드 예시입니다.
컬렉션에 대한 참조 설정:
let data = {
name: 'productName',
size: 'medium',
userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);
컬렉션(제품) 및 각 문서에 대한 모든 참조(사용자 세부 정보)를 가져옵니다.
db.collection('products').get()
.then(res => {
vm.mainListItems = [];
res.forEach(doc => {
let newItem = doc.data();
newItem.id = doc.id;
if (newItem.userRef) {
newItem.userRef.get()
.then(res => {
newItem.userData = res.data()
vm.mainListItems.push(newItem);
})
.catch(err => console.error(err));
} else {
vm.mainListItems.push(newItem);
}
});
})
.catch(err => { console.error(err) });
도움이 되었으면 좋겠다
참조는 외래 키와 매우 유사합니다.
현재 릴리스된 SDK는 다른 프로젝트에 대한 참조를 저장할 수 없습니다.프로젝트 내에서 참조는 다른 컬렉션에 있는 다른 문서를 가리킬 수 있습니다.
다른 값(필터링, 순서 지정 및 페이징(startAt/startAfter))과 마찬가지로 쿼리에서 참조를 사용할 수 있습니다.
SQL 데이터베이스의 외부 키와 달리 참조는 단일 쿼리에서 조인을 수행하는 데 유용하지 않습니다.종속된 룩업(join과 같은 룩업)에 사용할 수 있지만 각 홉은 서버에 대한 또 다른 라운드 트립이 되므로 주의해야 합니다.
참조에 의한 쿼리에 대한 Javascript 솔루션을 찾고 있는 경우 - 쿼리 스테이트먼트에 '문서 참조' 객체를 사용해야 한다는 개념입니다.
teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
//
}).catch(function(error) {
//
});
(이 답변에 대한 칭찬은 이쪽: https://stackoverflow.com/a/53141199/1487867)
#AskFirebase https://youtu.be/Elg2zDVIcLo?t=276에 따르면 현재 주요 사용 사례는 Firebase 콘솔 UI 링크입니다.
많은 답변이 다른 문서에 대한 참조일 뿐 해당 참조에 대한 데이터는 반환하지 않지만 데이터를 개별적으로 가져오는 데 사용할 수 있습니다.
여기 파이어베이스에서 사용하는 방법의 예가 있습니다.JavaScript SDK 9, modular
버전입니다.
당신네 소방서에 '세븐스'라는 컬렉션이 있다고 가정해봅시다products
다음 문서가 포함되어 있습니다.
{
name: 'productName',
size: 'medium',
userRef: 'user/dfjalskerijfs'
}
여기서 사용자는 에 있는 문서를 참조합니다.users
수집.다음의 코드 세그먼트를 사용해 제품을 취득해, 참조로부터 유저를 취득할 수 있습니다.
import { collection, getDocs, getDoc, query, where } from "firebase/firestore";
import { db } from "./main"; // firestore db object
let productsWithUser = []
const querySnaphot = await getDocs(collection(db, 'products'));
querySnapshot.forEach(async (doc) => {
let newItem = {id: doc.id, ...doc.data()};
if(newItem.userRef) {
let userData = await getDoc(newItem.userRef);
if(userData.exists()) {
newItem.userData = {userID: userData.id, ...userData.data()}
}
productwithUser.push(newItem);
} else {
productwithUser.push(newItem);
}
});
여기서collection, getDocs, getDoc, query, where
필요한 경우 언제든지 데이터를 얻기 위해 사용할 수 있는 Firestore 관련 모듈입니다.products
다음 코드를 사용하여 해당 참조에 대한 사용자 문서를 가져오려면 직접 문서를 작성하십시오.
let userData = await getDoc(newItem.userRef);
modular ver SDK 사용 방법에 대한 자세한 내용은 공식 문서를 참조하십시오.
참조 데이터 유형을 사용하지 않는 경우 모든 문서를 업데이트해야 합니다.
예를 들어, 「카테고리」와 「제품」의 2개의 컬렉션이 있고, 다음과 같이 「Apple」와 「Lemon」의 각 문서의 카테고리에 「Fruits」라고 하는 카테고리명을 보존하고 있습니다.단, 카테고리의 카테고리명 「Fruits(과일)」를 갱신하는 경우는, 제품의 「Apple(애플)」및 「Lemon(레몬)」의 모든 문서에 있는 카테고리명 「Fruits(과일)」도 갱신할 필요가 있습니다.
collection | document | field
categories > 67f60ad3 > name: "Fruits"
collection | document | field
products > 32d410a7 > name: "Apple", category: "Fruits"
58d16c57 > name: "Lemon", category: "Fruits"
단, 제품의 "Apple" 및 "Lemon"의 모든 문서에 카테고리의 "Fruits" 참조를 저장하는 경우 카테고리 이름 "Fruits"를 업데이트할 때 "Apple" 및 "Lemon"의 모든 문서를 업데이트할 필요는 없습니다.
collection | document | field
products > 32d410a7 > name: "Apple", category: categories/67f60ad3
58d16c57 > name: "Lemon", category: categories/67f60ad3
이 값은 기준 데이터 유형의 우수도입니다.
자동 결합:
델 텔레폰
expandRef<T>(obs: Observable<T>, fields: any[] = []): Observable<T> {
return obs.pipe(
switchMap((doc: any) => doc ? combineLatest(
(fields.length === 0 ? Object.keys(doc).filter(
(k: any) => {
const p = doc[k] instanceof DocumentReference;
if (p) fields.push(k);
return p;
}
) : fields).map((f: any) => docData<any>(doc[f]))
).pipe(
map((r: any) => fields.reduce(
(prev: any, curr: any) =>
({ ...prev, [curr]: r.shift() })
, doc)
)
) : of(doc))
);
}
수집
expandRefs<T>(
obs: Observable<T[]>,
fields: any[] = []
): Observable<T[]> {
return obs.pipe(
switchMap((col: any[]) =>
col.length !== 0 ? combineLatest(col.map((doc: any) =>
(fields.length === 0 ? Object.keys(doc).filter(
(k: any) => {
const p = doc[k] instanceof DocumentReference;
if (p) fields.push(k);
return p;
}
) : fields).map((f: any) => docData<any>(doc[f]))
).reduce((acc: any, val: any) => [].concat(acc, val)))
.pipe(
map((h: any) =>
col.map((doc2: any) =>
fields.reduce(
(prev: any, curr: any) =>
({ ...prev, [curr]: h.shift() })
, doc2
)
)
)
) : of(col)
)
);
}
이 함수를 관찰 가능한 주위에 배치하기만 하면 모든 참조 데이터 유형이 자동으로 확장되어 자동 결합을 제공합니다.
사용.
this.posts = expandRefs(
collectionData(
query(
collection(this.afs, 'posts'),
where('published', '==', true),
orderBy(fieldSort)
), { idField: 'id' }
)
);
주의: 배열에서 두 번째 인수로 전개할 필드를 입력할 수도 있습니다.
['imageDoc', 'authorDoc']
이렇게 하면 속도가 빨라집니다!
.pipe(take(1)).toPromise();
약속해!
자세한 내용은 여기를 참조해 주세요.파이어베이스 8 또는 9에서 작동!
심플!
J
뒤늦게 이 블로그의 장점은 두 가지입니다.
평가, 발행일, 또는 대부분의 업보트로 레스토랑 리뷰를 주문하고 싶은 경우 복합 인덱스를 필요로 하지 않고 리뷰 서브컬렉션 내에서 할 수 있습니다.더 큰 최상위 컬렉션에서는 각각에 대해 개별 복합 인덱스를 생성해야 하며 복합 인덱스는 200개로 제한됩니다.
나는 200개의 종합지수를 가지고 있지 않지만 몇 가지 제약이 있다.
또한 보안 규칙의 관점에서 상위 문서에 있는 일부 데이터에 기반하여 하위 문서를 제한하는 것은 매우 일반적이며, 하위 컬렉션에 데이터가 설정되어 있으면 훨씬 더 쉽게 수행할 수 있습니다.
예를 들어, 사용자가 부모 필드에 권한이 없는 경우 자식 컬렉션을 삽입하는 것을 제한하는 경우가 있습니다.
2022년 갱신
let coursesArray = [];
const coursesCollection = async () => {
const queryCourse = query(
collection(db, "course"),
where("status", "==", "active")
)
onSnapshot(queryCourse, (querySnapshot) => {
querySnapshot.forEach(async (courseDoc) => {
if (courseDoc.data().userId) {
const userRef = courseDoc.data().userId;
getDoc(userRef)
.then((res) => {
console.log(res.data());
})
}
coursesArray.push(courseDoc.data());
});
setCourses(coursesArray);
});
}
언급URL : https://stackoverflow.com/questions/46568850/what-is-firebase-firestore-reference-data-type-good-for
'programing' 카테고리의 다른 글
MariaDB convert_tz maketime (0) | 2022.09.15 |
---|---|
진행률 표시기를 순수 C/C++(cout/printf)로 표시하는 방법 (0) | 2022.09.15 |
벡터 반복, 스캔을 사용한 유형 오류 (0) | 2022.09.15 |
DOM 트리 변환 후 Vue.js 구성 요소를 마운트하여 vue 구성 요소를 추가합니다. (0) | 2022.09.15 |
node.js를 사용하여 콜백이 호출될 때까지 함수를 대기시키는 방법 (0) | 2022.09.08 |