在Node.js / Express.js中从数据库(MongoDB)caching数组

我想添加用户search自动完成(如Facebook的)到我的Rails应用程序在Heroku,我select编写它在Node.js由于并发的要求。 search首先从Mongo中抽取一个用户的好友列表(包括所有的Twitter好友,不仅仅是他们的朋友在我们的网站上),然后search该列表中的用户,然后search其他任何匹配查询的用户没有在朋友search返回的结果。

开始的时候速度相当快(约150毫秒),但对于有更多朋友的用户(总数超过100个)来说,加载他们的朋友arrays最终成为一个巨大的瓶颈,线性地减慢了search速度,最大值为1500毫秒对于具有1,000个朋友的用户(支持自动完成的朋友search的最大数量)。

问题是,我对Node.js和Express(它的类似Sinatra的web框架)完全陌生,我不知道如何cachingfriends数组,所以我只需要加载一次(理想情况下存储到内存中)。 在Heroku的Rails中,我只是将数组加载到Memcache中,但是我甚至不知道如何在Node / Express中configurationMemcache,更不用说如果Heroku支持它。

有任何想法吗?

(另外请注意,我是所有这些查询的多键索引,包括朋友ID)

我想mongodb将是完成匹配的地方。 看起来好像你正在试图把所有的结果都放回到自己的代码中,然后自己在一个数组中匹配它们。 您可能会发现要求mongodb过滤掉前10个匹配结果,然后直接发送给客户端会更快。

关于数据库的最好的部分是他们可以为你做这个过滤并且很快。 它应该超越其他解决scheme。 信任数据库,mongodb的重点在于查询速度应该非常快,接近memcache的速度。 你只需要问这个正确的问题。 而且我想象你可以很难用锤子敲击数据库,但是请确保只请求你打算使用的确切的#匹配。

为了匹配约翰·斯米…也许这样的事情(我只是做了这个来表明这个想法):

friendIdList //假定是来自您的应用程序的简单的ID数组

var matchFriends = db.people.find({person_id:{$ in:friendIdList},name:/ john smi。* / i}).sort({name:1}).limit(10);

查看有关正则expression式查询的mongodb文档

希望这有帮助,我只是学习MongoDB而不是专家,但这是我如何处理其他数据库上的问题

我对Node.js或Express了解甚less。 不过,我可以告诉你,你可能想要做这个客户端。 ( 即:cookie客户端上的朋友列表,并使用JavaScript进行search

如果你看看FB的实现,这就是他们正在做的事情(至less在几个月前)。

我build议,如果你不打算把所有的名字都预装到客户端,那么在input第一个字符之后你会更好地进行search。 这将减less您需要search的分数,然后将该请求提交给数据库。 然后,您可以按字母顺序返回这些结果,一旦更多的字符被input,您可以过滤而无需sorting。 只要用户没有成千上万的朋友称为“大卫·史密斯”,每个请求就应该满足你的150毫秒的目标。