是否可以遍历两个不同的集合并根据Firebase中的ID合并来自它们的信息

时间:2019-04-06 00:24:17

标签: javascript firebase google-cloud-firestore

我正在制作一个以Firebase作为数据库的Web应用程序,但是使用JavaScript编程时遇到了问题。我有两组不同的集合,其中包含信息。为了避免重复,我需要将它们合并以从中获取数据。为此,我继续在其中一个集合中创建ID,以将其与另一个集合相关联。

  

以下是我从另一个堆栈尝试过的一些代码溢出 Link to that forum

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在两组集合中找到。我需要旅行收集的行进路线信息。 我需要用户集合中的信息,因为它必须拥有所有者信息,例如名称和电子邮件。

在进行了研究和反复试验之后,我发现这可能对此有所帮助。

这是我以前的经历。希望它可以为我使用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 :(得分:0)

NoSQL世界中一种常见的方法是在遇到您在问题中描述的情况时复制数据。数据存储一点也不昂贵,您应该以一种优化查询的方式对数据库建模,而不必优化存储(通过像在SQL DB中那样进行标准化)。

换句话说,您将fNamelNamelaNamewscEmailphoneNumber的值保存在Trips下的文档中集合。

您可以通过这种方法在网络上找到很多“文学”,例如https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/。您还可以观看以下视频https://www.youtube.com/watch?v=vKqXSZLLnHA(适用于实时数据库,但也适用于Firestore)。