Node.js 除了在MongoDB中为博客标记系统嵌套标记数组之外,还有其他方法吗?

Node.js 除了在MongoDB中为博客标记系统嵌套标记数组之外,还有其他方法吗?,node.js,mongodb,nosql,Node.js,Mongodb,Nosql,我正试图用node.js/express/mongodb(也是学习node.js的起点)为自己编写一个博客引擎。要比Internet上的教程更进一步,我想向博客引擎添加标记支持 我想用标签做以下事情: 观众可以在“标记云页面”上看到所有标记作为标记云 观众可以在文章列表页面和单个文章页面上看到文章的标签 观众可以点击一个标签来显示文章列表 此外,浏览者还可以通过以下方式搜索带有particluar标记的文章:[tag1][tag2]-->/tags/tag1+tag2-->同时包含tag1和ta

我正试图用node.js/express/mongodb(也是学习node.js的起点)为自己编写一个博客引擎。要比Internet上的教程更进一步,我想向博客引擎添加标记支持

我想用标签做以下事情:

  • 观众可以在“标记云页面”上看到所有标记作为标记云
  • 观众可以在文章列表页面和单个文章页面上看到文章的标签
  • 观众可以点击一个标签来显示文章列表
  • 此外,浏览者还可以通过以下方式搜索带有particluar标记的文章:[tag1][tag2]-->/tags/tag1+tag2-->同时包含tag1和tag2的文章列表
  • 在关系数据库中,一个post_标记表将用于此目的。但是如何在MongoDB中设计这个

    我查过了
    但正如埃夫迪评论的那样,设计

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

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

    db.movies.distinct("tags")
    
    这也是我关心的:在我的设计中,我需要显示所有标签的列表;我还需要知道每个标签有多少文章。那么,有没有比上述设计更好的方法呢


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

    您如何获得整个电影收藏中使用的标签的独特列表

    db.movies.distinct("tags")
    
    为了高效查询,我可能会复制数据。标签不太可能被编辑,所以我将标签数组放在article对象中,然后也将标签放在标签集合中,标签要么有包含该标签的文章计数,要么有文章ID数组

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

    您将如何获得整个电影收藏中使用的标签的独特列表

    db.movies.distinct("tags")
    
    为了高效查询,我可能会复制数据。标签不太可能被编辑,所以我将标签数组放在article对象中,然后也将标签放在标签集合中,标签要么有包含该标签的文章计数,要么有文章ID数组

    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项任务。例如,对于所有标记的列表,您会将标记作为键发出,然后在reduce函数中对它们进行计数并返回计数。这就是我要走的路线。它可能需要更多的思考,但它绝对强大


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


    首先需要在标记上创建多键索引

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

    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
    },
    
    使用aggregate命令,您可以返回一个内联结果,因此,如果经常使用该结果,则需要客户端应用程序(或服务器)来序列化或缓存该结果

    让我知道你是怎么做的


    Sam

    首先需要在标记上创建一个多键索引

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

    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
    },
    
    使用aggregate命令,您可以返回一个内联结果,因此,如果经常使用该结果,则需要客户端应用程序(或服务器)来序列化或缓存该结果

    让我知道你是怎么做的


    山姆

    真正的问题是。。。这将检查集合中的所有项目,对吗?是的,这不是最佳解决方案,只是显示查询是可能的。请参见编辑,我会在多个位置复制标签。不确定您的意思。顺便说一句,你可以为每个标签保留文章计数。它将是“手动维护”的,因为在添加/删除标记时,您必须增加/减少计数。实际上,我不确定它是否会覆盖集合中的所有项目。如果您确保标记数组上的索引,则可能不会。真正的问题是。。。这将检查集合中的所有项目,对吗?是的,这不是最佳解决方案,只是显示查询是可能的。请参见编辑,我会在多个位置复制标签。不确定您的意思。顺便说一句,你可以为每个标签保留文章计数。它将是“手动维护”的,因为在添加/删除标记时,您必须增加/减少计数。实际上,我不确定它是否会覆盖集合中的所有项目。如果您确保在标记数组上建立索引,它可能不会。不,如果您为标记字段建立索引,它不会查看任何文档。不,如果您为标记字段建立索引,它不会查看任何文档。谢谢您的回答!那么,这与themanatuf回答中提供的MapReduce函数(特别是性能函数)之间的主要区别是什么呢?agg框架是mongodb中聚合信息的新方法。是相对较新但更易于使用的mapreduce,还通过在单个管道中组合运算符提供了附加功能。我想mapreduce管道应该是project和group。使用agg框架,您可以在单个ope中匹配、项目、组和任何其他您想要的内容