我正在开发一个具有搜索功能的小方案项目.我正在使用附加到使用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 - 将所有标签存储在集合中的简单数组中是最好的方法吗?随着时间的推移,这个数组将非常大.我不再是一个数据库人员,所以我对如何处理这样的问题没有很好的理解.
一如往常任何和所有的帮助非常感谢.
由于mongodb无法进行连接,我会将标签存储在每个视频文件中myVideo.tags = ['sports', 'baseball', 'pitcher']
.然后,为了支持您的自动提示,我会定期在视频集合中映射/缩小,并将活动标记集输出到单独的标记集合中.您甚至可以计算一个受欢迎度分数并存储类似于{tag: 'baseball', score: 156}
在156个视频中使用"棒球"标签的情况,并使用它来对您的自动提示结果进行排序,以便在用户输入"ba"时更早显示更受欢迎的标签例如'棒球'在'烘焙'之前列出,因为它更可能是正确的完成而不是按字母顺序排在第二位.
这是mongodb食谱中的直接例子.
要在你的问题中指出第2点,不要.永远不要将无限长的数据集作为数组存储在mongodb文档中.最大文档大小(目前为16MB),因此随着时间的推移而增长和增长的任何东西都必须是不同文档的集合.