0

現時点では、配列に保存したチーム ID のリストがありますteamIdsfindByKey私のTeamマングーススキーマには、キーに基づいてチームを見つける機能もあります。コードからわかるように、新しいTeam.findByKeyものを前のものの中に入れなければなりません。前の findByKey の外に置くと、正しく機能しません。

Team.findByKeyメソッドをある種の for ループに入れ、配列teamIdsと for eachをループできるようにするのに問題がありますTeam。新しいトーナメントを作成する関数を開発しています。チーム ID の配列をここに渡し、各 ID をループしてそのチームを検索し、それをteamsList配列に追加してトーナメントを作成します。

Teamオブジェクトの配列を作成する最後のコードを最後のTeam.findByKeyメソッドに入れる必要がありますが、これが私の問題です。nチームの数を渡して各チームを見つけ、配列として保存できるように、これをどのように修正しTeamsますか?

これは私のコードです:

  app.get('/tournament', function(req, res){
    function genMatches(nTeams) {
      var matchArray = [];
      while (nTeams > 1) {
          nTeams = nTeams >> 1;
          var matches = [];
          for (var i = 0; i < nTeams; ++i) {
              matches.push([]);
          }
          matchArray.push(matches);
      }
      return matchArray;
    }

    var teamIds = [
      1364472344972,
      1363173222886,
      1363007586845,
      1363007557484
    ]

    var tournamentName = 'My Tournament';

    Team.findByKey(teamIds[0], function(err, team1) {
        if(err) {
          util.log("Error occured");
        }
        if(!team1) { 
          util.log("The team does not exist");
        }
        Team.findByKey(teamIds[1], function(err, team2) {
          if(err) {
            return util.log("Error occured");
          }
          if(!team2) { 
            return util.log("The team does not exist");
          }
          Team.findByKey(teamIds[2], function(err, team3) {
            if(err) {
              return util.log("Error occured");
            }
            if(!team3) { 
              return util.log("The team does not exist");
            }
            Team.findByKey(teamIds[3], function(err, team4) {
              if(err) {
                return util.log("Error occured");
              }
              if(!team4) { 
                return util.log("The team does not exist");
              }
              var teamList = [
                team1._id,
                team2._id,
                team3._id,
                team4._id
                ];

              var numRounds = Math.log(teamList.length)/Math.log(2);

              var matches = genMatches(teamList.length);
              for(var i = 0; i < matches[0].length; i++){
                matches[0][i] = [ teamList[i+i], teamList[i+(i+1)] ]
              }

              var tournament = new Tournament({
                name: tournamentName,
                teams: teamList,
                rounds: numRounds,
                matches: matches
              });

              res.send(tournament);

            });
          });
        });
      });
  });

チーム スキーマ:

'use strict';

var util = require('util');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var validatePresenceOf = function(value){
  return value && value.length; 
};

var toLower = function(string){
  return string.toLowerCase();
};

var getId = function(){
  return new Date().getTime();
};

/**
  * The Team schema. we will use timestamp as the unique key for each team
  */
var Team = new Schema({
  'key' : {
    unique : true,
    type : Number,
    default: getId
  },
  'name' : { type : String,
              validate : [validatePresenceOf, 'Team name is required'],
              index : { unique : true }
            }
});

/**
  * Get complete team details for all the teams
  */
Team.statics.getAll = function(cb){
  var query = this.find({});
  query.sort({key : -1});
  return query.exec(cb);
};

Team.statics.findByKey = function(key, cb){
  return this.find({'key' : key}, cb);
};

Team.statics.findByName = function(name, cb) {
  return this.find({'name' : name}, cb);
};

module.exports = mongoose.model('Team', Team);
4

1 に答える 1

1

演算子を使用して$in、1 つのクエリで 4 つのチームを検索できます。

Team.find({key: {$in: teamIds}}, function (err, teams) {
  ...
});

なんらかの理由findByKeyで、すべてを単一の に折りたたむのではなく、複数回呼び出す必要がある場合は、ライブラリのメソッドを使用してそれをよりきれいに行うことを$in検討してください。asynceach

于 2013-04-01T12:40:09.840 に答える