Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何最好地';尾部-f';mongo通过meteor收集了大量数据?_Node.js_Mongodb_Sorting_Meteor - Fatal编程技术网

Node.js 如何最好地';尾部-f';mongo通过meteor收集了大量数据?

Node.js 如何最好地';尾部-f';mongo通过meteor收集了大量数据?,node.js,mongodb,sorting,meteor,Node.js,Mongodb,Sorting,Meteor,我在mongo数据库中有一个集合,可以附加一些日志类型的信息。我正在尝试找出“tail-f”的最有效/最简单的方法,即在meteor应用程序中,当向集合中添加新文档时,应将其发送给客户端,客户端应将其附加到集合中当前文档集的末尾 客户不会被发送,也不会保存收藏中的所有文档,很可能只是最后100个左右的文档 现在,从Mongo的角度来看,我认为没有一种方式可以说“集合中的最后N个文档”,这样我们就根本不需要应用任何排序。看起来最好的选择是进行自然排序降序,然后进行限制调用,就像 因此,在服务器端A

我在mongo数据库中有一个集合,可以附加一些日志类型的信息。我正在尝试找出“tail-f”的最有效/最简单的方法,即在meteor应用程序中,当向集合中添加新文档时,应将其发送给客户端,客户端应将其附加到集合中当前文档集的末尾

客户不会被发送,也不会保存收藏中的所有文档,很可能只是最后100个左右的文档

现在,从Mongo的角度来看,我认为没有一种方式可以说“集合中的最后N个文档”,这样我们就根本不需要应用任何排序。看起来最好的选择是进行自然排序降序,然后进行限制调用,就像

因此,在服务器端AFAICT上,发布此“最后100个文档”Meteor集合的方式如下:

Meteor.publish('logmessages', function () {
  return LogMessages.find({}, { sort: { $natural: -1 }, limit: 100 });
});
现在,从“tail-f”的角度来看,这似乎具有将“最后100个文档”发送到服务器的正确效果,但这样做的顺序是错误的(最新的文档将在Meteor集合的开头而不是结尾)

在客户端,这似乎意味着需要(不幸地)撤销收集。现在,我没有看到按$natural:1排序的reverse()在客户端不起作用(这似乎是合理的,因为没有真正的Mongo上下文)。在某些情况下,消息在文档中会有时间戳,客户机可以根据时间戳进行排序,以恢复“自然顺序”,但这似乎有点骇人听闻

无论如何,我觉得我可能错过了一个更简单的方法,那就是从mongo通过meteor发布一个实时的“最后100个文档插入到收藏中”收藏

谢谢

编辑-看起来如果我将Mongo中的集合更改为一个有上限的集合,那么服务器就可以高效(快速)获得添加到集合中的新文档的通知。但是,我不清楚是否/如何通过Meteor收集让服务器这样做

另一种似乎效率稍低但不需要切换到capped集合(AFAICT)的方法是使用它跟踪oplog,因此至少它是事件驱动的,而不是轮询的,而且由于源集合中的所有操作都是插入操作,因此它似乎仍然相当有效。不幸的是,AFAICT我仍然面临排序问题,因为我不知道如何将服务器端集合定义为“插入的最后100个文档”:(


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

对于仅插入的数据,
$natural
将获得与时间戳索引和排序相同的结果,这是一个好主意。相反的事情是不幸的;我认为您有两个选择:

  • 使用$natural并自己做相反的操作
  • 添加时间戳,仍然使用$natural
  • 添加时间戳、按时间索引、排序
  • “#1”-对于100个项目,即使对于移动设备,执行反向客户端也应该没有问题,这将从服务器上卸载它。您可以使用
    .fetch()
    将其转换为数组,然后将其反转以维持秩序,而无需使用时间戳。不过,您将在普通数组中玩;没有更多漂亮的mini mongo功能,因此在反转之前先进行任何过滤

    “#2”-这一个很有趣,因为您不必使用索引,但仍然可以使用客户端上的时间戳对记录进行排序。这使您能够在mini mongo land中享受生活的好处

    #3-占用了db的空间,但这是最直接的

    如果您不需要mini mongo的功能(或者您自己可以轻松地进行阵列过滤),那么#1可能是最好的

    不幸的是,MongoDB没有视图,因此无法实现您的log-last-100视图想法(尽管这是一个不错的特性)

    除此之外,请密切关注您的订阅生命周期,这样用户在不查看日志时就不会在后台不断删除日志更新。我可以看出,这很快就会成为性能杀手

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