我正在为mongodb中的各种事物创建一个基于标签的搜索引擎 我有博客文档,推荐文档,评论文档,书籍文档和图像文档,所有这些都有标记数组字段。
现在,当我拿到一本书中有一些与之相关的标签时,我还希望用这些标签来获取博客,推荐和评论。 当我拿到一个博客时我想也一样..用博客拥有的标签取消休息。 我正在设计我的数据库模型。什么是处理这种基于标签的搜索的最佳方式 目前我在想的是
这是最好的方法吗?我该如何设计模型?
更新: 我会更频繁地进行搜索。
答案 0 :(得分:3)
如果您需要在多个集合中重复标记,我宁愿做一个标记集合本身。
想想你以后是否需要更改一个标签的名称,可能是因为错误就像拼错一样,你需要遍历所有搜索此标签的集合来修复它。如果你只需要在一个地方更换,那会不会更容易?
在一个文档中嵌入数组和对象是一个强大的工具,但有时候它不是最好的解决方案。这种情况就是其中之一,你应该尽可能地防止重复。
Official documentation talking about avoid repetition.
创建标签集合并将其ObjectId添加到其他文档中的tags数组而不是标签本身。如下所示。
// tags collection
{
_id: <ObjectId1>
title: "trending"
}
// all other documents (blogs, testimonials...)
{
_id: <ObjectId2>
tags: [
<ObjectId1>
],
// other stuff...
}
当您获取一个文档时,您可以使用运算符 $ in 查找其所有标记并查找包含相关标记的其他文档,如下所示:
db.blogs.find({
tags: {
$in: [
<ObjectId1>,
<ObjectIdX>,
// other tags ids
]
}
})
这将立即返回与一个或多个标签匹配的所有文件。
使用得好的索引会对性能产生很大影响。这不是教他们如何工作的地方,但是mongodb有multikey indexex,在你的具体案例中,有一个是标记的。
示例:
db.blogs.createIndex( { "tags": 1 } )