将双重嵌套的JSON对象解析为MongoDB

时间:2014-09-04 01:45:37

标签: json node.js mongodb

我的MongoDB模型的模式:

var resultsSchema = new mongoose.Schema({
   start_date: String,
   end_date: String,
   matches:[{
       id:Number,
       match_date:String,
       status:String,
       timer:Number,
       time:String,
       hometeam_id:Number,
       hometeam_name:String,
       hometeam_score:Number,
       awayteam_id:Number,
       awayteam_name:String,
       awayteam_score:Number,
       ht_score:String,
       ft_score:String,
       et_score:String,
       match_events:[{
           id:Number,
           type:String,
           minute:Number,
           team:String,
           player_name:String,
           player_id:Number,
           result:String
       }]
    }] 
});

来自服务器的JSON数据示例:

"matches":
[
    {
        "match_id":"1234"
        "match_date":"Aug 30"
        ...
        ...
        "match_events":
        [
            {
                "event_id":"234",
                "event_minute":"38",
                ...,   
                ...
            },
            { 
                "event_id":"2334",
                "event_minute":"40",
                ...,   
                ...
            }
         ],
    {
        "match_id":"454222"
        "match_date":"Aug 3"
        ...
        ...
        "match_events":
        [
            {
                "event_id":"234",
                "event_minute":"38",
                ...,   
                ...
            },
                ....

我当前的实现仅用于解析匹配(即第一个数组)。但我似乎无法正确访问内部数组。

async.waterfall([
    function(callback) {
        request.get('http://football-api.com/api/?Action=fixtures&APIKey=' + apiKey + '&comp_id=' + compId +
            '&&from_date=' + lastWeek_string + '&&to_date=' + today_string, function(error, response, body) {
                if (error) return next(error);
                var parsedJSON = JSON.parse(body);

                var matches = parsedJSON.matches;
                var events = parsedJSON.matches.match_events;

                var results = new Results({
                    start_date: lastWeek_string,
                    end_date: today_string,
                    matches:[]
                });
                _.each(matches, function(match) {
                    results.matches.push({
                        id: match.match_id,
                        match_date: match.match_formatted_date,
                        status:match.match_status,
                        timer:match.match_timer,
                        hometeam_id:match.match_localteam_id,
                        hometeam_name:match.match_localteam_name,
                        hometeam_score:match.match_localteam_score,
                        awayteam_id:match.match_visitorteam_id,
                        awayteam_name:match.match_visitorteam_name,
                        awayteam_score:match.match_visitorteam_score,
                        ht_score:match.match_ht_score,
                        ft_score:match.match_ft_score,
                        et_score:match.match_et_score,
                        match_events:[]
                    });
                });
                _.each(events, function(event) {
                    results.matches.match_events.push({
                        id:event.event_id,
                        type:event.event_type,
                        minute:event.event_minute,
                        team:event.event_team,
                        player_name:event.event_player,
                        player_id:event.event_player_id,
                        result:event.event_result
                    });
                });

我理解第二个_.each循环应该针对每个匹配进行迭代,因为非常match拥有它自己的events子数组。我只是不确定如何构建它并且一直在努力。

我尝试在_.each(matches, function(match) {循环中嵌套该循环,但这不起作用。

谢谢。

编辑:我怎么能让它工作?

var results = new Results({
    start_date: lastWeek_string,
    end_date: today_string,
    matches:[
        match_events: []
    ]
});

因为那时@zangw说我可以先构造match_events数组,然后将它附加到匹配项,依此类推。

0 个答案:

没有答案