Mongodb中基于标签的搜索模型

时间:2018-04-09 03:56:44

标签: database mongodb database-design

我正在为mongodb中的各种事物创建一个基于标签的搜索引擎 我有博客文档,推荐文档,评论文档,书籍文档和图像文档,所有这些都有标记数组字段。

现在,当我拿到一本书中有一些与之相关的标签时,我还希望用这些标签来获取博客,推荐和评论。 当我拿到一个博客时我想也一样..用博客拥有的标签取消休息。 我正在设计我的数据库模型。什么是处理这种基于标签的搜索的最佳方式 目前我在想的是

  • 在每个文档中添加标记
  • at fetch,take tag并搜索所有其他文档
  • 获取结果,然后使用结果发送

这是最好的方法吗?我该如何设计模型?

更新: 我会更频繁地进行搜索。

1 个答案:

答案 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
    ]
  } 
})

这将立即返回与一个或多个标签匹配的所有文件。

More about $in operator.

其他提示

使用得好的索引会对性能产生很大影响。这不是教他们如何工作的地方,但是mongodb有multikey indexex,在你的具体案例中,有一个是标记的。

示例:

db.blogs.createIndex( { "tags": 1 } )