我正在做一个具有搜索功能的小项目。我正在使用附加到使用 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']
。然后为您的自动建议提供动力,我会定期映射/减少视频集合并将事件标签集输出到单独的标签集合。对于在 156 个视频中使用了“棒球”标签的情况,您甚至可以计算人气分数并存储类似 {tag: 'baseball', score: 156}
的内容,并使用它来对您的视频进行排序自动建议结果,以便在用户键入“ba”时更早地显示更受欢迎的标签,例如“baseball”列在“baking”之前,因为它更有可能正确完成而不是按字母顺序排在第二位。
Here's an example of exactly this straight out of the mongodb cookbook .
关于您问题中的第 2 点,不。切勿将无限长度的数据集存储为 mongodb 文档中的数组。存在最大文档大小(目前为 16MB),因此任何会随着时间不断增长的东西都必须是不同文档的集合。
关于javascript - 在 MongoDB 中存储大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915581/