添加了未发布给客户的字段?

时间:2016-03-28 22:28:40

标签: meteor

我在Meteor中进行聚合,我试图找到' thingies'在给定距离内并将其发布给客户:

Meteor.publish("thingieSearch", function(userId) {
  check(userId, String);
  var subscription = this;
  var thingies = {};
  var userId = this.userId;
  var usrAcc = Meteor.users.findOne({_id: userId});
  var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
  var pipeline = [{
    $geoNear: {
      near: usrAcc.profile.location.geometry.coordinates,
      distanceField: "calculatedDistance",
      spherical: true,
      limit: 100,
      distanceMultiplier: 3959.2,
      maxDistance: 0.075,
      query: {
        "status": "started",
        "owner": {$ne: userId} },
    }
  }];
  db.collection("thingies").aggregate(
    pipeline,
    Meteor.bindEnvironment(
      function (err, result) {
        console.log('result', result);
        _.each(result, function (r) {
          chases[r._id] = r;
          subscription.added("thingieSearch", r._id, {
            chase: r
          });
        })
      }
    )
  );
  subscription.ready();
});

当我在服务器端执行console.log时,它看起来是正确的,' distanceField'我指定为' calculatedDistance'计算并显示为字段。

在客户端,我订阅了这个出版物,我可以看到这些东西,但我看不到计算出的距离'领域。

知道为什么吗?

1 个答案:

答案 0 :(得分:1)

这里有两件事。

1)由于您使用的是mongodb远程收集驱动程序,因此您的出版物不会将数据反应性地更新到客户端。如果您打算将其作为非反应性,则可以使用流星方法而不是发布,并在userId更改时调用该方法。

2)我认为您在客户端使用thingies集合而没有看到calculatedDistance字段。您需要创建仅限客户端的集合(thingieSearch)来访问自定义发布的结果,如

//On client side only
thingieSearch = new Mongo.Collection("thingieSearch");

thingieSearch.findOne(); // After the publication, you should be able to see the results with calculatedDistance

您应该使用在subscription.added块内传递的任何名称来创建集合。例如,如果您的出版物有

subscription.added("thingieWithCalculateField", r._id, { chase: r });

你应该做

//On client side only
thingieWithCalculateField = new Mongo.Collection("thingieWithCalculateField");
// instead of thingieSearch = new Mongo.Collection("thingieSearch");

有关详细信息,请参阅Meteor.publish documentation中的counts-by-room出版物。