我在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'计算并显示为字段。
在客户端,我订阅了这个出版物,我可以看到这些东西,但我看不到计算出的距离'领域。
知道为什么吗?
答案 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
出版物。