Можно ли перемещаться по двум различным коллекциям и объединять информацию из них на основе идентификатора в Firebase - PullRequest
0 голосов
/ 06 апреля 2019

Я делаю веб-приложение с FireBase в качестве базы данных, но у меня возникла проблема при программировании на JavaScript. У меня есть два разных набора коллекций с информацией в них. Чтобы избежать дублирования, мне нужно объединить их, чтобы получить от них данные. Для этого я создал идентификаторы в одной из коллекций, чтобы связать их с другой.

Вот код, который я пробовал из другого стека переполнение Ссылка на этот форум

db.collection("articlesCollection")
    .doc(articleId)
    .get()
    .then(article => {
        firebase.firestore().collection("commentsCollection")
            .where('articleRef.' + article.id, '==', true)
            .get()
            .then(results => {
                results.forEach(function (comment) {
                    console.log(comment.id, " => ", comment.data());
                });
            });
    });

Это код из приведенного выше кода, который я пытался переназначить, но в итоге остановился, не понимая, как работает его структура.

db.collection("Users").get().then(article => {
   firebase.firestore().collection("trips").where('Users.' + doc.id, '==', ownersID)
        .get()
        .then(results => {
            //got lost here. I need the forEach function, but 
            results.forEach(function (comment) {
                console.log(comment.id, " => ", comment.data());
                //eventually change these into variables to display in a 
                //form.
});
});
});

Ниже будет краткое изложение структуры моей базы данных. Также будет информация, которую я буду использовать () для описания происходящего.

Trips\uniqueID(generated by Google)\ownerID(& other info)

Users\ownerID\info.

Как вы можете видеть, ownerID находится в двух наборах коллекций. Мне нужна информация из коллекции поездок о том, куда они идут. Мне нужна информация из коллекции Users, потому что она содержит информацию о владельце, такую ​​как имя и адрес электронной почты

После исследования, проб и ошибок вот что я нашел, что может помочь с этим.

Вот что у меня было раньше. Надеюсь, это даст мне больше информации о том, что я пытаюсь сделать с моим JavaScript.

 db.collection("trips").where("flag", "==", true) 
                .get().then(function (querySnapshot) {
                    querySnapshot.forEach(function (doc) { 

    //this info needs to be taken from the Users collection
    var fiName = doc.data().fName;
    var laName = doc.data().lName;
    var fullName = fiName + " " + laName;
    var wscEmail = doc.data().wscEmail;
    var phoneNum = doc.data().phoneNumber;

    //Information that I can take from the trips table.
    var id = doc.data().ownerID;
    var idName = doc.id;
    var destination = doc.data().destination;
    var location = doc.data().location;
    var date = doc.data().dateGoing;
    var arrivalTime = doc.data().arrivalTime;
    var departureTime = doc.data().departureTime;
    var returnTime = doc.data().returnTime;
    var seats = doc.data().seats;
    //leave this for now. Gopal is working on it
    //var email = "temp@Email";
    //This is something we can do, but we can also leave it
    //var phoneNum = "(712) 111-2211";
    var description = doc.data().tripDescription;


    feed.innerHTML += " \
            <div'>\
                <div class='post'>\
                    <div>\
                        <img src='circleProfile.png' alt='User photo'>\
                        <div class='name'> <p>" + fullName + "</p></div>\
                        <div>Destination: <span class='postInfo'>" + destination + "</span></div>\
                        <div>Location: <span class='postInfo'>" + location + "</span></div>\
                        <div>Date: <span class='postInfo'>" + date + "</span></div>\
                        <table>\
                        <tr>\
                            <th>Departure</th>\
                            <th>Arrival</th>\
                            <th>Return</th>\
                            <th>Seats</th>\
                        </tr>\
                        <tr>\
                            <td>" + departureTime + "</td>\
                            <td>" + arrivalTime + "</td>\
                            <td>" + returnTime + "</td>\
                            <td>" + seats + "</td>\
                        </tr>\
                        </table>\
                        <div>\
                        <p>Email: " + wscEmail + " <span class='postInfo'>" + phoneNum + "</span></p>\
                        </div>\
                        <div class='description'><p>" + description + "</p></div>\
                        <div class='spaceWars' onclick='deletePost(this.id)' id=" + idName + "> <button> Click me</button> </div>\
                    </div>\
                </div>\
            </div>";

  });

});

});

Как вы видели, в этой таблице есть информация, которая мне нужна из другой коллекции. Проблема в том, что я не знаю, как включить другую коллекцию.

Примечание: я впервые работаю с нереляционной базой данных, поэтому форматирование и структура, стоящие за ней, отбрасывают меня. Существует также тот факт, что есть некоторые вещи, для которых у firebase еще нет функциональности, что делает эту задачу немного сложнее.

Спасибо за чтение, я знаю, что это было много, и если вы пройдете через все это и поймете, что я делаю, я очень ценю это. Надеюсь, в будущем это поможет другим понять.

1 Ответ

0 голосов
/ 06 апреля 2019

Один из распространенных подходов в мире NoSQL - дублирование данных при возникновении ситуации, описанной в вашем вопросе.Хранение данных совсем не дорого, и вам следует смоделировать базу данных таким образом, чтобы оптимизировать запросы и не обязательно оптимизировать хранилище (путем нормализации, как это делается в БД SQL).

Другими словами, вы должны сохранить значения fName, lName, laName, wscEmail и phoneNumber в документе в коллекции Trips.

YouВы найдете много «литературы» в Интернете по этому подходу, например, https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/.. Вы также можете посмотреть следующее видео https://www.youtube.com/watch?v=vKqXSZLLnHA (которое предназначено для базы данных реального времени, но также применимо к Firestore).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...