1

我正在尝试使用 node.js/express/mongodb 为自己编写一个博客引擎(也是学习 node.js 的开始)。为了比 Internet 上的教程更进一步,我想为博客引擎添加标签支持。

我想用标签做以下事情:

  1. 查看者可以在“标签云页面”上将所有标签视为标签云
  2. 查看者可以在文章列表页面和单篇文章页面上看到文章的标签
  3. 查看者可以单击单个标签来显示文章列表
  4. 更重要的是,查看者可以通过 SO 方式搜索带有特定标签的文章: [tag1][tag2] --> /tags/tag1+tag2 --> 同时具有 tag1 和 tag2 的文章列表

在关系数据库中,将使用 post_tag 表。但是如何在 MongoDB 中设计呢?

我检查了MongoDB 设计 - 标签
但正如 efdee 评论,设计

db.movies.insert({
  name: "The Godfather",
  director: "Francis Ford Coppola",
  tags: [ "mafia", "wedding", "violence" ]
})

有问题:

这似乎并没有真正回答他的问题。您将如何获得在整个电影收藏中使用的不同标签列表?

这也是我关心的问题:在我的设计中,我需要显示所有标签的列表;我还需要知道每个标签有多少篇文章。那么有没有比上面展示的设计更好的方法呢?

我对上述设计的关注是:如果我想显示标签列表,查询将遍历数据库中的所有文章项目。有没有更有效的方法?

4

3 回答 3

3

您需要在标签上创建一个多键索引才能开始。

然后您将能够使用此语法找到文档匹配标签

db.movies.find({ "tags": { $all : [ /^this/, /^that/ ] }})

因为您使用 reg ex mongo 的 ^ (字符串开头)仍将使用索引。

要获取关键字密度,使用聚合框架,您可以简单地获取计数。

db.movies.aggregate({ $project: { _id:0, tags: 1}}, 
    { $unwind: "$tags" },
    { $group : { _id : "$tags", occur : { $sum : 1 }}})

抱歉,从 iPad 格式化困难。

您最终会收集到如下所示的文档:

{
   _id: "mytag",
   occur: 383
},
{
   _id: "anothertag",
   occur: 23
},

使用聚合命令,您可以返回内联结果,因此如果经常使用结果,将由客户端应用程序(或服务器)来序列化或缓存结果。

让我知道你是怎么做到的。

Hth

山姆

于 2012-10-05T20:19:14.493 回答
0

您将如何获得在整个电影收藏中使用的不同标签列表?

db.movies.distinct("tags")

对于有效的查询,我可能会重复数据。标签不太可能被编辑,所以我将标签数组放在文章对象中,然后将标签放在标签集合中,标签有包含该标签的文章计数,或者文章数组身份证。

db.movies.insert({
  id: 1,
  name: "The Godfather",
  director: "Francis Ford Coppola",
  tags: [ "mafia", "wedding", "violence" ]
});

db.tags.insert([
   {name: "mafia", movie_count: 1},
   {name: "wedding", movie_count: 1},
   {name: "violence", movie_count: 1}
});
于 2012-10-05T16:38:38.860 回答
-1

您可以使用 MapReduce 函数执行 4 个任务。例如,对于所有标签的列表,您将发出标签作为键,然后在 reduce 函数中将它们全部计数并返回计数。那将是我要走的路线。它可能需要更多的思考,但它绝对是强大的。

http://cookbook.mongodb.org/patterns/count_tags/

于 2012-10-05T18:43:25.637 回答