【问题标题】:How to update a doc value from an iron-router function如何从 Iron-router 函数更新 doc 值
【发布时间】:2013-11-28 00:53:36
【问题描述】:

我知道这是一个简单的问题,但我正在尝试解决如何从 Iron 路由器中的路由更新文档中的值。我找到了需要放置该函数的位置,但我正在努力使用使其工作所需的 mongo 代码。

我试图在每次单击链接时增加一个视图元素,因此已将以下代码添加到路由中。

   data: function () {
      var project = projectDocs.findOne(this.params._id);
      // need to increment views value by one
      console.log(project.views);
      projectDocs.update({id: project.id},
        {$inc: {views: 1}}
      );
      console.log(project.views);
      return project;
    }

  });

project.views 值正在返回正确的值,但更新该值的代码此时会引发异常。

我尝试了简单的 project.views++,它在函数中增加变量,但它永远不会被推送到数据库(我猜这并不奇怪)。

有人能指出我需要将这个值设置为 inc 的方向吗(这甚至是正确的地方吗?)。

谢谢。

彼得。

好的,我发现这个链接让我了解了http://books.google.com.au/books?id=uGUKiNkKRJ0C&pg=PA37&lpg=PA37&dq=Cannot+apply+$inc+modifier+to+non-number&source=bl&ots=h7qyOddRsf&sig=EWFw9kNLGHoFEUS-nTNsBStDRcQ&hl=en&sa=X&ei=cRGXUse0DNGciAfk6YHgCA&ved=0CFcQ6AEwBQ#v=onepage&q=Cannot%20apply%20%24inc%20modifier%20to%20non-number&f=false 的一部分,它解释了你只能添加数字值(我似乎把它当作一个字符串。

现在的问题是我似乎陷入了无限循环。

函数现在看起来像

 this.route('projectPage', {
    path: '/projects/:_id',
    waitOn: function() {
      return Meteor.subscribe('singleProject', this.params._id);
    },
    data: function () {
      var project = projectDocs.findOne(this.params._id);
      // need to increment views value by one
      console.log("Views", project.views);
      console.log("Project", project);
      projectDocs.update(project._id,
        {$inc: {views: 1}}
      );
      console.log(project.views);
      return project;
    }

  });

为什么会这样循环?

【问题讨论】:

    标签: mongodb meteor iron-router


    【解决方案1】:

    使用 _id 代替 id。所以

          projectDocs.update({_id: project._id},
            {$inc: {views: 1}}
          );
    

    如果不是这样,也许你可以用你得到的任何异常来更新你的答案。

    【讨论】:

    • 好的,更改了代码以匹配您在此处的代码,控制台中抛出的异常是“在模拟调用'/projectDocs/update'的效果时出现异常错误:无法将$inc修饰符应用于非-number ...r("不能将 $inc 修饰符应用于非数字");"后面是一大堆代码。
    • views 字段必须是一个数字,这是例外的说法。解决这个问题,更新应该可以工作了。
    【解决方案2】:

    只需进一步阅读关于 Iron-router 的精彩新文档,并将 $inc 函数移至卸载钩子,一切似乎都很好。

     this.route('projectPage', {
        path: '/projects/:_id',
        waitOn: function() {
          return Meteor.subscribe('singleProject', this.params._id);
        },
        data: function () {
          return projectDocs.findOne(this.params._id);
        },
        unload: function() {
          var project = projectDocs.findOne(this.params._id);
          // need to increment views value by one
          projectDocs.update(project._id,
            {$inc: {views: 1}}
          );
        }
        // could possibly use layout: popup_layout? here
      });
    

    希望得到一些确认,这实际上是我应该这样做的地方(而且做这么多“findOne”似乎有点低效)但它目前正在工作。

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2014-12-15
      • 1970-01-01
      相关资源
      最近更新 更多