2013-10-06 38 views
10

我有一个在mongo数据库中的集合,我追加了一些记录类型的信息。我试图找出最有效/最简单的方法来在流星应用程序中“尾巴” - 随着新文档被添加到集合中,它应该被发送给客户端,客户端应该将它追加到最后该集合中的当前文档集合。如何最好地通过流星“尾巴”在蒙戈的大集合?

客户端不会被发送,也不会保留集合中的所有文档,可能只是最后的约100个左右。

现在,从Mongo的角度来看,我没有看到说“收集中最后N个文档”的方式,因此我们根本不需要应用任何类型的文档。这似乎是最好的选择可用做天然的降序排序,则限制呼叫,所以像什么在the mongo doc on $natural

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

上市所以,在服务器端AFAICT出版这“最后的100个文件”流星之路收集会是这样的:现在

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

,从“尾-f”的角度来看,这似乎已经发出了“最后100个文件”到服务器的物权效力,但在错误的顺序这样做(最新的文件将在流星收集的开始,而不是最后)。

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

在任何情况下,我觉得我可能会错过一个更简单的方法,通过流星从mongo发布一个活的'最后100个文档插入集合'集合。 :)

谢谢!

编辑 - 看起来像如果我在蒙戈更改收集到带盖的集合,那么服务器会create a tailable cursor有效(和快速)得到通知的添加到集合中的新文档。但是,我不清楚是否/如何通过Meteor集合让服务器这样做。

另一种看起来效率稍低但不需要切换到加盖集合(AFAICT)的替代方法是使用Smart Collections,它可以确定oplog的尾部,因此至少它是事件驱动的,而不是轮询,并且由于所有操作在源代码集合中将被插入,看起来它仍然非常高效。不幸的是,AFAICT我仍然留下排序问题,因为我没有看到如何将服务器端集合定义为'插入最后100个文档'。 :(

如果有一种在Mongo中创建一个集合作为另一个查询(“物化视图”的排序),那么也许我可以在Mongo中创建一个log-last-100“集合视图”,那么流星将能够发布/订阅整个伪集合?

回答

3

对于仅插入数据,$natural应该为您提供与时间戳和排序索引相同的结果,因此这是一个好主意。相反的事情是不幸的;我觉得你有一对夫妇选择:

  1. 使用$自然和反向做自己
  2. 添加时间戳,仍然使用$自然
  3. 添加时间戳,指数时间,排序

“ #1' - 对于100个项目,做反向客户端应该不会出现问题,即使是移动设备也是如此,并且会从服务器上卸载它。您可以使用.fetch()转换为数组,然后反转它以保持顺序,而无需使用时间戳。尽管你会在普通的阵列中打球,没有更好的迷你mongo功能,所以在倒车之前先做任何过滤。

'#2' - 这一个很有趣,因为您不必使用索引,但仍然可以使用客户端上的时间戳对记录进行排序。这给你留在迷你孟加拉土地的好处。

“→3” - 成本空间数据库,但其最直接的

如果您不需要迷你蒙戈的能力(或舒适做阵列过滤自己),那么#1可能最好。

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

除了上述内容,请关注您的订阅生命周期,以便用户在查看日志时不会持续在后台下拉日志更新。我可以看到,这很快就成为一名表现杀手。