除了在MongoDB中为Blog-Tag系统嵌套标签数组之外,还有什么其他方法吗?

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

我想用标签做以下事情:

  1. 观众可以将所有的标签看作“标签云页面”上的标签云,
  2. 观众可以在文章列表页面和单个文章页面上看到文章所具有的标签
  3. 观众可以点击一个标签来显示文章列表
  4. 更重要的是,观众能够以SO方式search具有特定标签的文章:[tag1] [tag2] – > / tags / tag1 + tag2 – >具有tag1和tag2的文章列表

在关系数据库中,post_tag表将用于此。 但是如何在MongoDB中devise这个呢?

我检查了MongoDBdevise – 标签
但正如efdee的评论,devise

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

有一个问题:

这似乎并没有真正回答他的问题。 你将如何获得在整个电影集合中使用的不同的标签清单?

这也是我的担心:在我的devise中,我需要显示所有标签的列表; 我也需要知道每个标签有多less文章。 那么是否有比上面所示的devise更好的方法?

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

您需要在标签上创build一个多键索引。

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

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

因为你正在使用reg(mongo)的^(string的开始)将仍然使用索引。

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

 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 }, 

使用聚合命令你可以得到一个内联的结果,所以如果经常使用的话,那么客户端应用程序(或者服务器)就会对结果进行序列化或者caching。

让我知道你如何继续。

心连心

山姆

你将如何获得在整个电影集合中使用的不同的标签清单?

 db.movies.distinct("tags") 

为了高效查询,我可能会重复数据。 标签是不太可能被编辑的,所以我把标签数组放在文章对象中,然后也把标签放在标签集合中,标签有一个包含该标签的文章的计数,​​或者文章数组IDS。

 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} }); 

你可以使用MapReduce函数执行你的4个任务。 例如,对于所有标签的列表,你会发射标签作为关键,然后在减lessfunction,你可以统计他们,并返回计数。 那将是我下去的路线。 它可能需要更多的思考,但它绝对是强大的。

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