【问题标题】:List related tags for blog posts stored in MongoDB列出存储在 MongoDB 中的博客文章的相关标签
【发布时间】:2011-01-06 05:45:46
【问题描述】:

我试图弄清楚如何从存储在 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之外构造这些值。我正在寻找更有效的方法。

【问题讨论】:

    标签: mongodb


    【解决方案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']
    

    【讨论】:

    • 我没有想到这个选项。好主意。
    【解决方案2】:

    你不会找到的。 MongoDB 的查询能力非常有限(但非常高效)。对于像您需要 map/reduce 这样的事情,但由于今天的 MongoDB M/R 是单线程的,并且它的 JS 引擎不是最快的,您最终可能已经拥有最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多