2014-02-11 138 views
1

我正在使用d3绘制一个带有x和y坐标的流星集(Hostiles)到图像上。我可以成功地做到这一点。但是,我有一个发布功能,可以检查用户登录名是admin还是普通用户。如果用户是管理员,它使用d3绘制所有点,但是当它是任何其他用户时,它只绘制特定于用户位置的点。流星发布/订阅延迟时间

//Base Publish on User Type 
if (user === true) { 
    //Admin Return all Points 
    return Hostiles.find(); 
} else { 
    //Any other user returns location specific points 
    return Hostiles.find({latitude: {$lte: xLoc + 80, $gte: xLoc - 80}, longitude: {$lte: yLoc + 80, $gte: yLoc - 80}}); 
}; 

所有这些工作正常。当我更改Hostile位置的xLocyLoc时,会发生此问题。当管理员登录时,随着集合中的更改,重绘将立即生效。但是,当普通用户登录时,重绘时间会有所延迟。这个d3重画通常需要3-10秒。在客户端,我有我的订阅和d3绘制在Meteor.autorun(function() {。也许有没有办法解决这个问题?谢谢。

+1

我假设从'Session'中检索到'xLoc'和'yLoc'?因为如果它们不是,那么只有当其他被动数据源发生变化时(或者如果光标中的数据发生变化,这可能是你所看到的那样,每10秒钟一次),'autorun'才会被执行。 –

+3

在Meteor博客上阅读本文:https://www.meteor.com/blog/2013/12/17/meteor-070-scalable-database-queries-using-mongodb-oplog-instead-of-poll-and -diff - MongoDB oplog的当前实现仅支持对标量字段进行等式检查。所有其他操作(如您的lte/gte检查)仍然使用旧的10秒轮询/比较方法。这将在1.0之前改变,因为Meteor团队在oplog实施中增加了更多的操作员。 – sbking

+0

@musically_ut他们收到使用会话。 – Nate

回答

1

“目前MongoDB的oplog的实现只支持对标量字段的平等检查,所有其他操作(比如你的lte/gte检查)仍然使用旧的10秒poll/diff方法,这会在1.0之前更改,因为Meteor团队增加了更多的操作员到oplog实现中。“ - @ Cuberto https://www.meteor.com/blog/2013/12/17/meteor-070-scalable-database-queries-using-mongodb-oplog-instead-of-poll-and-diff

但是,有一个解决方法是在未发布的devel分支上。见https://github.com/meteor/meteor/wiki/Oplog-Observe-Driver。它允许使用Minimongo支持的任何不包含$ where或$ near的选择器。只需使用meteor --release oplog-with-operators即可。 感谢@Cuberto和@alanning的出色解决方案。