【问题标题】:How to use find/findOne outside of a helper function如何在辅助函数之外使用 find/findOne
【发布时间】:2016-01-25 10:23:50
【问题描述】:

我正在尝试在转换函数中使用 findOne 语句从集合中访问文档。

  this.helpers({
    posts: function () {
      return Posts.find(this.getReactively('filter'), {sort: {createdAt: -1}, transform: function (doc) {
        var restaurant = Restaurants.findOne(doc.rest_id);
          doc.restaurant = restaurant.name;
          doc.neighborhood = restaurant.neighborhood;
        return doc;
      }});
    }
  });

问题是对 findOne 的调用没有返回任何内容(未定义)。同样,使用 find.fetch() 返回一个空数组。

在排除故障后,我发现在我的代码中的任何位置运行 find 或 findOne 时,除了直接作为帮助程序(即 return Posts.find() 工作正常)之外,什么也没有返回。我了解到客户端此时可能尚未完成对数据的订阅,但客户端上没有任何显示。

在控制台上运行相同的 Restaurants.find 或 findOne 可以正常工作,返回预期的文档。

我是否正在尝试做一些 angular-meteor 不支持的事情?是否仅在助手的上下文中支持查找功能?

【问题讨论】:

  • MongoDB 是一个基于文档的数据库。在这样的数据库中,您希望在 Posts 集合中直接定义 restaurantneighborhood 属性。
  • “没有任何东西出现在客户端”“在控制台上运行相同的 Restaurants.find 或 findOne 工作正常”.. ?如果第一个是真的,那么你没有发布数据。如果后者为真,那么您正试图在它准备好之前访问这些数据。

标签: angularjs meteor angular-meteor


【解决方案1】:

我认为您在这里缺少的部分是 Mongo 正在调用 transform 函数(即在 Mongo 调用中):这不是回调函数。

因此,您需要获取文档,然后为每个获取的文档 findOne。

this.helpers({
    posts: function () {
      var my_posts = Posts.find(this.getReactively('filter'), {sort: {createdAt: -1}).fetch();
      my_posts.forEach(function (doc) {
        var restaurant = Restaurants.findOne(doc.rest_id);
          doc.restaurant = restaurant.name;
          doc.neighborhood = restaurant.neighborhood;
        return doc;
      }
    });        
});

【讨论】:

  • 非常感谢,完美运行。我已经被困在这个尴尬的时间了,我完全没有接受回调问题。
猜你喜欢
  • 2013-08-08
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 2021-05-26
  • 2018-07-08
  • 1970-01-01
相关资源
最近更新 更多