subcollection firestore data collection database firebase data-modeling google-cloud-firestore

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:

  1. title : Cadena
  2. subcolección llamada todo_items

Todos los documentos en la subcolección todo_items tiene

  1. title : Cadena
  2. 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 !