【问题标题】:Firebase: push multi child data using functionFirebase:使用函数推送多个子数据
【发布时间】:2014-08-25 05:42:12
【问题描述】:

我想将数据保存到 firebase 多子节点:

--Events
----Races
-------Participants

这是一个虚拟数据,这是我想保存到 firebase 的一种数据

  var dummyData = [

            {
                event_id: 1,
                event_venue: "Churchill Ground Venue",
                event_name: "Victoria Cup",
                event_type: "Holiday Special",
                event_datetime: now,
                event_url: 'www',
                races: {
                    1: {
                        race_id: 1,
                        race_type: "Horse Race",
                        race_url: "www",
                        race_name: "Super Hourse 8",
                        race_venue: "Ground No 7",
                        race_datetime: now,
                        races_participants: {
                            1: {
                                participants_id: 1211,
                                participants_name: "Doll Fire",
                                participants_place_odds: 10,
                                participants_win_odds: 5,
                                participants_result: 0,
                            }
                        }
                    },
                    2: {
                        race_id: 2,
                        race_type: "Horse Race 2",
                        race_url: "www",
                        race_name: "Super Hourse 9",
                        race_venue: "Ground No 7",
                        race_datetime: now,
                        races_participants: {
                            participants_id: {
                                participants_id: 222,
                                participants_name: "Doll Fire 2",
                                participants_place_odds: 130,
                                participants_win_odds: 54,
                                participants_result: 03,
                            }
                        }
                    }
                },
            },
        ];

 //calling Services to post data
  EventsFactory.postEvents(dummyData[0]);

  myApp.factory('EventsFactory', function(){
    var factiry = {};
     //post data to fb server
    factory.postEvents = function (data) {
        //passed data must be object
        var firebaseRef = new Firebase("https://api.firebaseio.com/");

        firebaseRef.child("events").push({
            event_id: data.event_id,
            event_venue: data.event_venue,
            event_name: data.event_name,
            event_type: data.event_type,
            event_url: data.event_url,
            event_datetime: data.event_datetime,
            races: {
              //not sure how to store multiple child, Cant call for each to loop 
              //each paased object from data var
                race_id: {
                    race_id: data.races.race_id,
                    race_type: data.races.race_type,
                    race_url: data.races.race_url,
                    race_name: data.races.race_name,
                    race_venue: data.races.race_venue,
                    race_datetime: data.races.race_datetime,
                    races_participants: {
                        participants_id: {
                            participants_id: data.races.races_participants.participants_id,
                            participants_name: data.races.races_participants.participants_name,
                            participants_place_odds: data.races.races_participants.participants_place_odds,
                            participants_win_odds: data.races.races_participants.participants_win_odds,
                            participants_result: data.races.races_participants.participants_result
                        }
                    }
                }
            },
        });
    }
    return factory;
  });

我的问题是:为什么 push 不存储数据数组并将其推送到 Firebase(包括所有子元素)

目前我得到:无法读取未定义的属性“participants_id” 在 Object.factory.postEvents 但我有数据数组中的所有值。

【问题讨论】:

    标签: javascript angularjs firebase angularfire


    【解决方案1】:

    您可以简单地将整个事件一次性推送到 Firebase。

    firebaseRef.child("events").push(data); // bad practice, don't do this!
    

    但这意味着您最终会为服务器上的子节点使用数组索引。众所周知,数组索引很可能会导致分布式数据结构出现问题。因此,只要您有类似列表的结构,最好将每个项目简单地push 放入 Firebase 并让它们为您生成一个唯一的 ID。

    对于您的情况,这意味着您需要循环推送每个event(示例中只有一个)、raceparticipant

    代码示例:

        // Add the event
        var event = firebaseRef.child("events").push({
            event_id: data.event_id,
            event_venue: data.event_venue,
            event_name: data.event_name,
            event_type: data.event_type,
            event_url: data.event_url,
            event_datetime: data.event_datetime
        });
    
        // Add then races to the event
        data.races.forEach(function(race) {
            var race = event.child("races").push({
                race_id: race.race_id,
                race_type: race.race_type,
                race_url: race.race_url,
                race_name: race.race_name,
                race_venue: race.race_venue,
                race_datetime: race.race_datetime,
            });
    
            // Add the participants to the race
            race.race_participants.forEach(function(participant) {
                race.child("participants").push({
                    participants_id: participant.participants_id,
                    participants_name: participant.participants_name,
                    participants_place_odds: participant.participants_place_odds,
                    participants_win_odds: participant.participants_win_odds,
                    participants_result: participant.participants_result
    
                });
            });
        });
    

    【讨论】:

    • 这不是一个糟糕的设计,因为如果您只想获取基本的“事件”信息,您最终将获取嵌套在父节点“下方”的所有内容。并不是说您的问题没有回答该人的原始询问,但是当任何特定节点下的项目数量可能变得很大时,这对于结构化数据来说有点反模式。您最终可能会检索 5000 名参与者,以获取有关事件/比赛的基本信息。这是一篇很好的文章,讨论了其中一些概念。 airpair.com/firebase/posts/structuring-your-firebase-data
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2015-01-22
    • 2017-07-08
    • 1970-01-01
    • 2017-08-17
    • 2018-07-08
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多