如何从Meteor游标中获取文档_id?

时间:2014-10-18 06:39:42

标签: meteor

我已经重写了这个问题,因为我现在更了解我的问题了。以下答案仍然相关。

我有以下查询返回记录。

Template.game.helpers({
  Game: function () {

  var myGame = Games.findOne(
      {
        game_minutes: {$gt: MinutesSinceMidnightNow},
        court_id: court,
        game_date: {$gt: lastMidnight}
      }, 
      {
        sort: {game_minutes: 1}
      }
      ); // find

  console.log(myGame);

  console.log(myGame._id);

  return myGame;

 } // game function
});  //template  scoreboard.helpers

Meteor.startup(function () {

    Meteor.call('removeGames', court, MinutesSinceMidnightNow);

    for(var i=0;i<incomingGames.length;i++){

        var game = incomingGames[i];

        var gameTime = game.game_time;

        if ( MinutesSinceMidnightGameTime(gameTime) > MinutesSinceMidnightNow ) {

           console.log("game # " + i + ' game time ' + MinutesSinceMidnightGameTime(gameTime) + ' now' + ' ' + MinutesSinceMidnightNow);

           Meteor.call('insertGame', game);

           }  // if
      }  // for

//       game = Meteor.call("nextGame", MinutesSinceMidnightNow, court, lastMidnight);

      console.log(MinutesSinceMidnightNow + ', ' + court + ', ' + lastMidnight);

    }); // startup

第一个console.log显示一个包含_id属性的游戏对象。第二个控制台日志引发错误。我怎样才能获得_id值?

在考虑更多这方面,代码可能实际上有效。控制台日志最终显示ID号。奇怪的是在游戏插入服务器启动之前发生错误。我想客户端在服务器之前启动,然后在服务器启动后与实际数据进行反应性调整?这很难让我从传统的网络开发中走出来。

这是控制台输出

undefined scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:118
Exception in template helper: TypeError: Cannot read property '_id' of undefined
    at Object.Template.game.helpers.Game (http://localhost:3000/client/scoreboard/scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:122:19)
    at http://localhost:3000/packages/blaze.js?88aac5d3c26b7576ac55bb3afc5324f465757709:2693:16
    at http://localhost:3000/packages/blaze.js?88aac5d3c26b7576ac55bb3afc5324f465757709:1602:16
    at Object.Spacebars.call (http://localhost:3000/packages/spacebars.js?3c496d2950151d744a8574297b46d2763a123bdf:169:18)
    at Template.game.HTML.DIV.Spacebars.With.HTML.SPAN.class (http://localhost:3000/client/scoreboard/template.scoreboard.js?0ad2de4b00dfdc1e702345d82ba32c20d943ac63:16:22)
    at null.<anonymous> (http://localhost:3000/packages/spacebars.js?3c496d2950151d744a8574297b46d2763a123bdf:261:18)
    at http://localhost:3000/packages/blaze.js?88aac5d3c26b7576ac55bb3afc5324f465757709:1795:16
    at Object.Blaze._withCurrentView (http://localhost:3000/packages/blaze.js?88aac5d3c26b7576ac55bb3afc5324f465757709:2029:12)
    at viewAutorun (http://localhost:3000/packages/blaze.js?88aac5d3c26b7576ac55bb3afc5324f465757709:1794:18)
    at Tracker.Computation._compute (http://localhost:3000/packages/tracker.js?192a05cc46b867dadbe8bf90dd961f6f8fd1574f:288:36) debug.js:41
game # 0 game time 1395 now 549 scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:148
game # 1 game time 1110 now 549 scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:148
game # 2 game time 1185 now 549 scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:148
game # 3 game time 1260 now 549 scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:148
549, 1, Wed Oct 22 2014 00:00:00 GMT+0930 (CST) scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:157
Object {_id: "scYEdthygZFHgP2G9", court_id: 1, game_date: Wed Oct 22 2014 09:09:50 GMT+0930 (CST), court_name: "Court 1", game_time: "18:30"…} scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:118
scYEdthygZFHgP2G9 

3 个答案:

答案 0 :(得分:2)

我无法对接受的答案发表评论,所以我将解释为什么你在这里看到日志错误。

您的代码运行正常,问题是(以及您的日志错误的原因)您没有考虑到您的游戏集合还没有填充任何数据。日志输出中的第一行显示为:

undefined scoreboard.js?c19ff4a1d16ab47e5473a6e43694b3c42ec1cc22:118

对应

console.log(myGame);

Meteor第一次呈现您的模板,您只是在游戏集合中没有任何数据 - 它是在通往您客户的路上的线上。当数据到达时,Meteor会自动重新运行模板,解释后续的控制台输出。

所以基本上,此时你的代码唯一出错的是控制台日志试图输出_id,因为在第一次评估期间没有游戏(因此你试图访问该属性&# 34;对象的_id&#34;&#34;未定义&#34; - 日志错误消息)。删除该行,你应该准备好了!

答案 1 :(得分:1)

如果传递给函数的参数是数组,则可以使用Array.every。如果它是光标,则您需要先fetch结果。

<强>更新

我刚看到你的评论。如果您要在timenow之后寻找第一个游戏,请执行以下操作:

game = Games.findOne({game_minutes: {$gt: timenow}, [ANY OTHER FILTER]}, {sort: {game_minutes: 1}});

我认为这个集合被称为Games,显然你需要在任何其他过滤器细节中替换以获得正确的游戏内容,但它应该有效。

答案 2 :(得分:1)

如果您可以访问游戏集,我更喜欢在您的查询中添加选择器和选项:

next_game = Games.find(
{
    game_minutes: {$gt: timenow}
}, 
{
    sort: {game_minutes: 1},
    limit: 1
});

如果没有,请获取,过滤,然后获取最小值。

new_games = games.fetch().filter(function(game){
    return game.game_minutes > timenow;
});

next_game = _.min(new_games, function(game){
    return game.game_minutes;
});