如何最好地通过meteor“尾巴”在蒙戈的大集合?

我有一个在Mongo数据库的集合,我追加了一些loggingtypes的信息。 我试图找出在meteor应用程序中“tail -f”的最有效/最简单的方法 – 当一个新文档被添加到集合中时,它应该被发送给客户端,客户端应该将其追加到最后集合中的当前文档集合。

客户不会被发送,也不会收集所有的文件,可能只是最后的100左右。

现在,从Mongo的angular度来看,我看不出有什么办法说“集合中的最后N个文件”,这样我们就根本不需要应用任何types的文件。 似乎最好的select是自然sorting降序,然后是一个限制调用,所以就像在mongo文档中列出的$ natural

db.collection.find().sort( { $natural: -1 } ) 

因此,在服务器端AFAICT发布这个“最后100个文件”meteor收集的方式是这样的:

 Meteor.publish('logmessages', function () { return LogMessages.find({}, { sort: { $natural: -1 }, limit: 100 }); }); 

现在,从“尾巴-f”的angular度来看,这似乎具有将“最后100个文档”发送到服务器的正确效果,但是以错误的顺序发送(最新的文档将在Meteor集合的开始处而不是最后)。

在客户端,这似乎意味着需要(不幸地)颠倒收集。 现在,我没有看到Meteor Collection文档中的 reverse(),并且按照$ natural:1的顺序进行sorting(这似乎是合理的,因为没有真正的Mongo上下文)。 在某些情况下,消息在文档中会有时间戳,客户端可以通过sorting来获得“自然顺序”,但是这看起来有点怪异。

无论如何,我觉得我可能错过了一个简单得多的方法,通过meteor从mongo发布了一个活的“最后100个文档插入到集合中”。 🙂

谢谢!

编辑 – 看起来像是如果我把Mongo中的集合更改为capped集合,那么服务器可以创build一个可拖动的光标,以便高效(快速)获得添加到集合中的新文档的通知。 然而,我不清楚是否/如何让服务器通过Meteor集合来实现。

另一种看起来效率稍低但不需要切换到加盖集合(AFAICT)的替代方法是使用智能集合来实现oplog的拖尾操作,因此至less它是事件驱动的,而不是轮询,并且由于源代码中的所有操作收集将被插入,似乎它仍然是非常有效的。 不幸的是,AFAICT我仍然留下sorting的问题,因为我没有看到如何定义服务器端收集为'最后100个文件插入'。 🙁

如果有一种方法可以在Mongo中创build一个集合来查询另一个(“sorting”的“物化视图”),那么也许我可以在Mongo中创build一个日志最后100个“集合视图”,然后Meteor将能够只是发布/订阅整个伪collections?

对于仅插入数据, $natural应该会得到与在时间戳和sorting上索引相同的结果,所以这是个好主意。 相反的事情是不幸的; 我想你有几个select:

  1. 使用$ natural,并自己做相反的事情
  2. 添加时间戳,仍然使用$自然
  3. 添加时间戳,按时间索引,sorting

“#1” – 对于100个项目,做反向客户端应该是没有问题的,即使是移动设备,也将从服务器上卸载它。 您可以使用.fetch()将其转换为数组,然后将其反转以保持顺序,而无需使用时间戳。 尽pipe你会在正常的阵容中打球, 没有更好的迷你mongofunction,所以做任何过滤前倒车。

'#2' – 这个很有趣,因为您不必使用索引,但是仍然可以使用客户端上的时间戳对logging进行sorting。 这给你留在迷你孟买土地的好处。

'#3' – 在db上花费空间,但是它是最直接的

如果你不需要mini-mongo的function(或者你可以自己做数组过滤),那么#1可能是最好的。

不幸的是,MongoDB没有意见,所以不能做你的日志最后100观点的想法(虽然这将是一个很好的function)。

除此之外,请留意您的订阅生命周期,以便用户在不查看日志时不会不断地在后台下拉日志更新。 我可以看到,迅速成为一个性能杀手。