database - क्लाउड फायरस्टोर गहरी उप-चयन के साथ मिलता है




firebase data-modeling (3)

अगर किसी को अभी भी फायरस्टोर में गहरी क्वेरी करने के बारे में जानने में दिलचस्पी है, तो यहां क्लाउड फ़ंक्शन का एक संस्करण है जो मैं आया हूं, जो सभी 'टोडोस' लौटाता है जिसमें 'todo_items' subcollection है।

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;
        })
}

मान लें कि हमारे पास 'todos' नामक मूल संग्रह है।

इस संग्रह में प्रत्येक दस्तावेज़ में है:

  1. title : स्ट्रिंग
  2. todo_items नाम todo_items

Subcollection todo_items में प्रत्येक दस्तावेज़ है

  1. title : स्ट्रिंग
  2. completed : बूलियन

मुझे पता है कि क्लाउड फायरस्टोर में पूछताछ डिफ़ॉल्ट रूप से उथला है, जो कि बहुत अच्छा है, लेकिन क्या todos से पूछताछ करने और परिणाम प्राप्त करने का कोई तरीका है जिसमें todo_items स्वचालित रूप से शामिल है?

दूसरे शब्दों में, मैं निम्नलिखित क्वेरी को todo_items में कैसे शामिल todo_items ?

db.collection('todos').onSnapshot((snapshot) => {
  snapshot.docChanges.forEach((change) => {
    // ...
  });
});

आप इस तरह कुछ कोशिश कर सकते हैं

db.collection('coll').doc('doc').collection('subcoll').doc('subdoc') 

उम्मीद है की यह मदद करेगा !


मुझे एक ही समस्या का सामना करना पड़ा है, लेकिन आईओएस के साथ, अगर मैं आपका प्रश्न प्राप्त करता हूं और यदि आप टू-डू संग्रह दस्तावेज़ के लिए ऑटो-आईडी का उपयोग करते हैं तो यह आसान होगा यदि आप मेरे मामले में शीर्षक फ़ील्ड के साथ दस्तावेज़ आईडी को स्टोर करते हैं तो यह आसान होगा:

let ref = self.db.collection("collectionName").document()

let data  = ["docID": ref.documentID,"title" :"some title"]

तो जब आप पुनर्प्राप्त करते हैं तो करने के लिए एक सरणी कहें और किसी भी आइटम पर क्लिक करते समय आप पथ से इतना आसान नेविगेट कर सकते हैं

ref = db.collection("docID/\(todo_items)")

काश मैं आपको सही कोड दे सकता हूं लेकिन मैं जावास्क्रिप्ट से परिचित नहीं हूं