在MongoDB中存储大型数组

时间:2014-01-04 01:17:00

标签: javascript node.js mongodb

我正在开发一个具有搜索功能的小方案项目。我正在使用附加到使用expressJS和mongoDB构建的REST API的typeahead.js。我想知道我遇到两个问题的最佳方法是什么。我主要是一个刚开始使用Node和MongoDB的前端人员。以下是我需要帮助的两个问题。但首先要有一点背景来更好地理解这些问题。

我正在建立的网站允许您上传视频。您可以为这些视频添加标签。搜索视频时,我希望能够使用typeahead.js搜索这些标记。就像YouTube一样。

所以这是问题所在。

1 - 我在MongoDB中有一个“标签”集合。上传视频时,我会为该视频添加标签并将其添加到此集合中,我将用于预测性搜索。随着时间的推移,这个集合应该有足够的标签来搜索。我遇到的问题是如何只插入唯一标签(那些尚未存在的标签)。例如,我想将以下文档插入MongoDB:

{
tags: "tag1, tag2, tag3, tag4, tag5, tag6, tag7, tag8"
}

该集合已经有“tag1,tag2,tag4和tag7”。所以我只想插入3,5,6和8.我的问题/问题是这样做的最佳方法。我应该首先查询集合,解析它并比较每个标记,将不存在的标记分开,然后将它们“追加”到集合中?我看到的问题是,随着时间的推移,这将是很多解析。所以我不确定这里最好的方法是什么。

2 - 将所有标签存储在集合中的简单数组中是最好的方法吗?随着时间的推移,这个数组将非常大。我不再是数据库人,所以我对如何处理这样的问题没有很好的理解。

一如既往,我们非常感谢所有人的帮助。

1 个答案:

答案 0 :(得分:7)

由于mongodb无法进行连接,因此我会将每个视频文档中的标记存储为la myVideo.tags = ['sports', 'baseball', 'pitcher']。然后,为了支持您的自动提示,我会定期在视频集合中映射/缩小,并将活动标记集输出到单独的标记集合中。你甚至可以为156个视频中使用'baseball'标签的情况计算一个流行度分数并存储类似{tag: 'baseball', score: 156}的内容,并使用它来对自动提示结果进行排序,以便在用户之前显示更流行的标签正在输入“ba”,例如“棒球”是在“烘焙”之前列出的,因为它更可能是正确的完成而不是按字母顺序排在第二位。

Here's an example of exactly this straight out of the mongodb cookbook

要在问题中指出第2点,不要。永远不要将无限长的数据集作为数组存储在mongodb文档中。最大文档大小(目前为16MB),因此任何随时间增长和增长的东西都必须是不同文档的集合。