하위 컬렉션으로 Cloud Firestore 심층 가져 오기
'todos'라는 루트 컬렉션이 있다고 가정 해 보겠습니다.
이 컬렉션의 모든 문서에는 다음이 포함됩니다.
title
: 문자열- 명명 된 하위 컬렉션
todo_items
하위 컬렉션의 모든 문서 todo_items
에는
title
: 문자열completed
: 부울
Cloud Firestore의 쿼리가 기본적으로 얕다는 것을 알고 있습니다. 이것은 훌륭하지만 자동으로 todos
하위 컬렉션을 포함하는 결과 를 쿼리 하고 가져올 수 있는 방법이 todo_items
있나요?
즉, 다음 쿼리에 todo_items
하위 컬렉션을 포함하려면 어떻게해야 합니까?
db.collection('todos').onSnapshot((snapshot) => {
snapshot.docChanges.forEach((change) => {
// ...
});
});
이 유형의 쿼리는 지원되지 않지만 향후 고려할 수 있습니다.
누군가가 여전히 firestore에서 깊은 쿼리를 수행하는 방법을 알고 싶다면 여기에 내가 생각 해낸 클라우드 함수 getAllTodos의 버전이 있습니다.이 버전은 'todo_items'하위 컬렉션이있는 모든 'todos'를 반환합니다.
exports.getAllTodos = function (req, res) {
getTodos().
then((todos) => {
console.log("All Todos " + todos) // All Todos with its todo_items sub collection.
return res.json(todos);
})
.catch((err) => {
console.log('Error getting documents', err);
return res.status(500).json({ message: "Error getting the all Todos" + err });
});
}
function getTodos(){
var todosRef = db.collection('todos');
return todosRef.get()
.then((snapshot) => {
let todos = [];
return Promise.all(
snapshot.docs.map(doc => {
let todo = {};
todo.id = doc.id;
todo.todo = doc.data(); // will have 'todo.title'
var todoItemsPromise = getTodoItemsById(todo.id);
return todoItemsPromise.then((todoItems) => {
todo.todo_items = todoItems;
todos.push(todo);
return todos;
})
})
)
.then(todos => {
return todos.length > 0 ? todos[todos.length - 1] : [];
})
})
}
function getTodoItemsById(id){
var todoItemsRef = db.collection('todos').doc(id).collection('todo_items');
let todo_items = [];
return todoItemsRef.get()
.then(snapshot => {
snapshot.forEach(item => {
let todo_item = {};
todo_item.id = item.id;
todo_item.todo_item = item.data(); // will have 'todo_item.title' and 'todo_item.completed'
todo_items.push(todo_item);
})
return todo_items;
})
}
나는 같은 문제에 직면했지만 IOS에서 질문을 받고 할 일 모음 문서에 자동 ID를 사용하는 경우 문서 ID를 내 경우 제목 필드와 함께 필드로 저장하면 쉽습니다.
let ref = self.db.collection("collectionName").document()
let data = ["docID": ref.documentID,"title" :"some title"]
따라서 검색 할 때 할 일의 배열을 말하고 항목을 클릭하면 경로로 쉽게 탐색 할 수 있습니다.
ref = db.collection("docID/\(todo_items)")
정확한 코드를 제공하고 싶지만 Javascript에 익숙하지 않습니다.
AngularFirestore (afs)와 Typescript를 사용했습니다.
import { map, flatMap } from 'rxjs/operators';
import { combineLatest } from 'rxjs';
interface DocWithId {
id: string;
}
convertSnapshots<T>(snaps) {
return <T[]>snaps.map(snap => {
return {
id: snap.payload.doc.id,
...snap.payload.doc.data()
};
});
}
getDocumentsWithSubcollection<T extends DocWithId>(
collection: string,
subCollection: string
) {
return this.afs
.collection(collection)
.snapshotChanges()
.pipe(
map(this.convertSnapshots),
map((documents: T[]) =>
documents.map(document => {
return this.afs
.collection(`${collection}/${document.id}/${subCollection}`)
.snapshotChanges()
.pipe(
map(this.convertSnapshots),
map(subdocuments =>
Object.assign(document, { [subCollection]: subdocuments })
)
);
})
),
flatMap(combined => combineLatest(combined))
);
}
다른 답변에서 지적했듯이 깊은 쿼리를 요청할 수 없습니다.
My recommendation: Duplicate your data as minimally as possible.
I'm running into this same problem with "pet ownership". In my search results, I need to display each pet a user owns, but I also need to be able to search for pets on their own. I ended up duplicated the data. I'm going to have a pets array property on each user AS WELL AS a pets subcollection. I think that's the best we can do with these kinds of scenarios.
you could try something like this
db.collection('coll').doc('doc').collection('subcoll').doc('subdoc')
Hope this helps !
ReferenceURL : https://stackoverflow.com/questions/46611279/cloud-firestore-deep-get-with-subcollection
'programing' 카테고리의 다른 글
C99에서 f () + g ()는 정의되지 않았습니까 아니면 단순히 지정되지 않았습니까? (0) | 2021.01.16 |
---|---|
RxJS에서 Observable 연결 (0) | 2021.01.16 |
JVM 시작 속도가 느린 이유는 무엇입니까? (0) | 2021.01.16 |
조각화없이 보낼 수있는 가장 큰 UDP 패킷을 찾는 방법은 무엇입니까? (0) | 2021.01.16 |
페이지가 이미 UTF-8 인 경우 HTML 양식에 accept-charset =“UTF-8”을 추가하면 어떤 이점이 있습니까? (0) | 2021.01.16 |