列出MongoDB中存储的博客文章的相关标签

时间:2011-01-06 05:45:47

标签: mongodb

我试图找出如何从MongoDB中存储的博客文章中获取相关标签的列表。

数据结构

{
    title: "Post #1",
    tags: { "news", "politics" }
},
{
    title: "Post #2",
    tags: { "news", "entertainment" }
},
{
    title: "Post #3",
    tags: { "entertainment", "music", "theatre" }
},
{
    title: "Post #4",
    tags: { "entertainment", "music", "concerts" }
}

期望的结果

如果我想获得与“娱乐”相关的标签列表,它会查询帖子以查找类似的标签。当帖子被标记为“娱乐”时,也会使用类似的标签。

我希望能够得到以下结果:

Tag       Count
========  ======
music     2    (because there are 2 posts tagged with music + entertainment)
concert   1
theatre   1
news      1

有没有办法尽可能接近它?我能够得到的最接近的是使用db.posts.find({tags: "entertainment"});,然后遍历并在MongoDb之外构造这些值。我正在寻找一种更有效的方式。

2 个答案:

答案 0 :(得分:1)

您可以将工作推送到写入端以保持快速读取。假设您正在尝试将new_tag添加到已有some_list_of_tags的帖子中。以下代码将构建具有所需值的集合:

for old_tag in some_list_of_tags:
    db.related_tags.update({'_id':new_tag}, {'$inc':{'counts.'+old_tag:1}}, upsert=True)
    db.related_tags.update({'_id':old_tag}, {'$inc':{'counts.'+new_tag:1}}, upsert=True)

然后要获得'娱乐的结果,请执行:

db.related_tags.find({'_id': 'entertainment'})

您可以使用findAndModify命令以原子方式将标记添加到帖子并获取所有现有标记:

old_tags = db.posts.findAndModify({query: {_id: ID},
                                   update: {$addToSet: {tags: new_tag}},
                                   fields: {tags: 1}
                                  })['tags']

答案 1 :(得分:0)

你找不到一个。 MongoDB具有非常有限(但非常有效)的查询功能。对于类似你需要map / reduce的东西,但是今天MongoDB M / R是单线程的,它的JS引擎并不是最快的,你可能最终得到了最好的解决方案。