database - data - Cloud Firestore deep get con subcolección
firestore subcollection (4)
Este tipo de consulta no es compatible, aunque es algo que podemos considerar en el futuro.
Digamos que tenemos una colección raíz llamada ''todos''.
Cada documento en esta colección tiene:
-
title
: Cadena - subcolección llamada
todo_items
Todos los documentos en la subcolección todo_items
tiene
-
title
: Cadena -
completed
: booleano
Sé que las consultas en Cloud Firestore son superficiales de manera predeterminada, lo cual es genial, pero ¿hay alguna manera de consultar los resultados y obtener los resultados que incluyen la subcolección todo_items
automáticamente?
En otras palabras, ¿cómo hago que la siguiente consulta incluya la subcolección todo_items
?
db.collection(''todos'').onSnapshot((snapshot) => {
snapshot.docChanges.forEach((change) => {
// ...
});
});
Me enfrenté al mismo problema, pero con IOS, de cualquier forma, si recibo su pregunta y si usa el ID automático para el documento de la colección Tareas, será fácil si guarda la ID del documento en otro lugar con el campo de título en mi caso:
let ref = self.db.collection("collectionName").document()
let data = ["docID": ref.documentID,"title" :"some title"]
Entonces, cuando recuperas, digamos una serie de cosas por hacer y cuando haces clic en cualquier elemento, puedes navegar tan fácilmente por la ruta
ref = db.collection("docID//(todo_items)")
Desearía poder darte el código exacto pero no estoy familiarizado con Javascript
Si alguien todavía está interesado en saber cómo hacer una consulta profunda en Firerestore, aquí hay una versión de la función en la nube getAllTodos que se me ocurrió, que devuelve todos los ''todos'' que tienen la subcolección ''todo_temas''.
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;
})
}
podrías probar algo como esto
db.collection(''coll'').doc(''doc'').collection(''subcoll'').doc(''subdoc'')
Espero que esto ayude !