MongoDB 架构设计 - 帖子投票

2024-03-11

假设我有一个网站,里面有很多文章,人们可以对他们喜欢的文章进行投票。

我希望能够查询得到在一定时间内(最后一小时、最后一天、上周)按票数排序的得票最多的文章。

与往常一样,MongoDB 有几种不同的方法来实现这一点,但我不确定哪一种是正确的。

  • 一个帖子文档,其中包含投票数组 - 投票本身是包含用户 ID、用户名和投票日期的文档:
    {
    "_id": "ObjectId(xxxx)",
    "title": "Post Title",
    "postdate": "21/02/2012+1345",
    "summary": "Summary of Article",

    "Votes": [
        {
            "userid":ObjectId(xxxx),
            "username": "Joe Smith",
            "votedate": "03/03/2012+1436"
        },
            ]
     }
  • 单独的投票集合,包含个人投票的详细信息以及对投票帖子的引用:
{
    "_id": "ObjectId(xxxx)",
    "postId": ObjectId(xxxx),
    "userId": ObjectId(xxxx),
    "votedate": "03/03/2012+1436"
}

第一个更加纪录片,但我不知道如何查询 votes 数组以获取过去 24 小时内得票最多的文档。

我倾向于第二个,因为我认为查询按投票分组的票数会更容易,但我不确定它的表现如何。这就是在关系数据库中执行此操作的方式,但它似乎不是很记录 - 但我不确定这是否是一个问题,是吗?

或者我使用两者的组合?我还会在每个页面加载时实时执行这种类型的聚合查询。或者我是否只是每分钟运行一次查询并将结果存储在查询结果集合中?

您将如何实现这个模式?


跟踪总体投票计数的常见方法是将投票数保留在帖子文档中,并在将新值推送到投票数组时自动更新投票数。

由于这是一次更新,因此可以保证计数与数组中的元素数量相匹配。

如果聚合的数量是固定的并且站点非常繁忙,您可以扩展此范例并增加额外的计数器,例如一个月、一天和一小时的计数器,但这可能很快就会失控。所以你可以使用新的聚合框架 http://docs.mongodb.org/manual/reference/aggregation/(在 2.1.2 开发版本中可用,将在 2.2 版本中投入生产。它比 Map/Reduce 使用更简单,并且它允许您非常简单地进行您想要的计算,特别是如果您小心地将投票日期存储为ISODate() 类型。

本月得票最高者的聚合查询的典型管道可能如下所示:

today = new Date();
thisMonth = new Date(today.getFullYear(),today.getMonth());
thisMonthEnd = new Date(today.getFullYear(),today.getMonth()+1);

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$group: { _id: "$title", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );

这会将管道的输入限制为通过将投票日期与您正在计票的月份进行匹配来获得投票的帖子,“展开”数组以获取每个投票的一个文档,然后执行“分组依据”等效操作,汇总每个标题的所有投票(我假设标题是唯一的)。然后,它按票数降序排序,并将输出限制为前十。

您还可以按天(例如)汇总该月的投票,以查看哪一天投票最活跃:

db.posts.aggregate( [
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$unwind: "$Votes" },
    {$match: { "Votes.votedate": {$gte:thisMonth, $lt:thisMonthEnd} } },
    {$project: { "day" : { "$dayOfMonth" : "$Votes.votedate" }  } },
    {$group: { _id: "$day", votes: {$sum:1} } },
    {$sort: {"votes": -1} },
    {$limit: 10}
] );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 架构设计 - 帖子投票 的相关文章

  • 从 JSON 字符串创建 BSON 对象

    我有一个 Java 应用程序 它从外部应用程序获取数据 传入的 JSON 位于字符串中 我想解析该字符串并创建 BSON 对象 不幸的是 我在 Java 的 BSON 实现中找不到该 API 我是否需要使用外部解析器 例如 GSON 而且
  • Pymongo 中的全文搜索

    即将推出的 MongoDB 2 4 支持全文检索 http docs mongodb org manual release notes 2 4 text indexes 我们在 mongo shell 中使用命令来执行此操作 例如 db p
  • 如何在 mongodb-native findAndModify 中使用变量作为字段名称?

    在使用 mongodb native 驱动程序的这段代码中 我想增加在单独变量中指定的字段的值 问题在于 在这种情况下 inc 子句中的字段名称将是 变量 而不是变量的内容 在查询部分中 所选变量按预期工作并找到正确的 ID var sel
  • 在 cl-mongo 中实现 MongoDB SASL 身份验证

    我已经从 fons 分叉了 cl mongo common lisp MongoDB 库 存储库 因为它已经不再维护并且不支持 SCRAM SHA 1 登录过程 这是我的叉子 https github com mprelude cl mon
  • 服务器发现和监控引擎已弃用

    我在 Node js 应用程序中使用 Mongoose 这是我的配置 mongoose connect process env MONGO URI useNewUrlParser true useUnifiedTopology true u
  • 为任何更新查询增加 Mongoose 文档版本的简单方法?

    我想开始利用 Mongooses 文档版本控制 v key 我在实际增加版本值时遇到了问题 然后我发现您必须添加this increment 执行查询时 有没有办法自动递增 目前 我只是将其添加到pre用于更新类型查询的中间件 module
  • 将 mongo 数组转换为具有键值对的对象

    我有一个包含字符串数组的 mongo 文档 我需要将这个特定的字符串数组转换为包含键值对的对象数组 以下是我目前的做法 id ObjectId 57e3720836e36f63695a2ef2 platform A1 available C
  • mongodb 正在运行吗?

    我已经在我的 Unix 服务器上安装了 Mongodb 和 PHP 驱动程序 我的问题是如何判断 Mongodb 是否正在运行 是否有一个简单的命令行查询来检查状态 如果我从外壳程序启动一次 如果我退出外壳程序 它会继续运行 情况似乎并非如
  • Mongoose 4.4.12 中 Schema 方法范围内的“this”为空 {}

    当在 Schema 方法内记录到控制台时 对象 this 为 这发生在一天前 我一直在阅读教程和其他堆栈溢出问题 但不幸的是我没有找到原因的解决方案 这是我的模型 var mongoose require mongoose var Sche
  • Flask 不加载配置

    我在 Flask 中加载配置时遇到问题 from config import config DevelopmentConfig TestingConfig ProductionConfig def create app config nam
  • Spring Data mongodb:添加 MongoDb 访问凭据

    我的 Spring 应用程序中有以下工作配置
  • MongoDB 中两个集合之间的 Diff()

    我做过研究 如果这是一个重复的问题 我很抱歉 但其他问题的解决方案并不适合我 因此 我提出了一个新问题 使用 Javascript 比较两个集合的最佳方法是什么 我有数千个这样的 Mongo 文档格式的标头 url google com h
  • $unwind聚合框架中的对象

    在 MongoDB 聚合框架中 我希望在对象 即 JSON 集合 上使用 unwind 运算符 看起来不像是这样possible http docs mongodb org manual reference aggregation S un
  • 将 Mongodb 与 Android 应用程序连接

    我正在尝试构建 Android 应用程序来连接到 MongoDB 一直被这个问题困扰 MongoDB 是可访问的 但没有安全性 可以通过手机使用 Mono Explorer 添加数据 public void sendMessage View
  • 使用 python 字典更新 MongoEngine 文档?

    是否可以使用 python 字典更新 MongoEngine 文档 例如 class Pets EmbeddedDocument name StringField class Person Document name StringField
  • 尝试使用 Mongoose 进行批量更新插入。最干净的方法是什么?

    我有一个集合 其中包含包含三个字段的文档 名字 姓氏和年龄 我试图找出 Mongoose 中的哪个查询可以用来进行批量更新插入 我的应用程序偶尔会收到具有相同三个字段的新对象数组 我希望查询检查文档中是否已存在名字和姓氏 如果存在 则更新年
  • 如何同时使用 $gt 和 $lte 优化 MongoDB 查询?

    我有以下查询 有点像反向范围查找 db ip ranges find and start ip num lte 1204135028 end ip num gt 1204135028 当仅使用 lte 标识符运行时 查询会立即返回 但是当我
  • Node.js 找不到模块“mongodb”

    我正在经历我的第一个 Node js 项目 我已经安装了 mongodb 有一个 server js 文件 当我尝试运行它时 出现此错误 module js 340 throw err Error Cannot find module mo
  • 由于类型错误无法创建索引:格式字符串参数不足

    我正在尝试使用 pymongo 创建索引 但因错误而失败 File D Users Dims Design EnergentGroup Python GIS Developer worker Approach03 sentinel mong
  • 缩短node.js和mongoose中的ObjectId

    我的网址目前如下所示 http www sitename com watch companyId 507f1f77bcf86cd799439011 employeeId 507f191e810c19729de860ea someOtherI

随机推荐

  • 在渐进式 Web 应用程序中使用系统应用程序打开文件

    我试图弄清楚是否可以使用默认系统应用程序从渐进式 Web 应用程序打开文件 这个想法是 PWA 将存储一些文件 例如 docx 文件 以供离线使用 并且用户无需 重新 下载它们即可打开它们 理想的情况是 PWA 能够将文件加载到内存中 使其
  • 在 spring-boot 中将 hashmap 转换为 json 字符串

    我正在创建一个 spring boot 应用程序 我希望能够将 hashmap 的全部内容作为 json 字符串返回 我怎么做 我的哈希图如下所示 private static final Map
  • Repa 中的转置和累积和性能不佳

    我开发了一个累积和函数 在 Haskell 库 Repa 中定义如下 但是 当将此函数与转置操作结合使用时 我遇到了问题 以下所有 3 个操作只需不到一秒 cumsum cumsum cumsum x transpose transpose
  • 关于 JPA 2.0 Criteria 的一些基本问题

    我今天发现了 JPA 2 0 Criteria API 并想学习它 只是浏览了一些示例并尝试动手操作 我有一个带有列的餐桌水果 id name color size taste 常规的东西 EntityManagerFactory emf
  • Python:使用渐进数字重命名列表中的重复项,而不对列表进行排序

    给定一个这样的列表 mylist name state name city name zip zip 我想通过附加数字来重命名重复项以获得以下结果 mylist name1 state name2 city name3 zip1 zip2
  • Angular/Ionic 和异步 SQLite - 确保数据工厂在返回前初始化

    我正在使用 Ionic 编写 PhoneGap Cordova 应用程序 并使用 SQLite 与 ngCordova 进行持久存储 该应用程序的核心是从 SQLite 数据库检索的项目的滚动列表 列表控制器 js controller L
  • 以 maner 设置 JTextField 宽度以换行给定文本

    我有一个不可编辑且已禁用的JtextField我将在其中放一个String请求数据库后获得 我希望这个JtextField包裹我所有的字符串 我看到了setColumn and setSize 方法 但我首先不知道我的String leng
  • XMLHttpRequest 将变量传递给 php 脚本

    我正在尝试使用 XMLHttpRequest 将变量传递给 php 脚本 然后让 php 回显它 我不明白为什么它不起作用 有人可以帮助我吗 这是 JavaScript
  • 为什么清除中断标志会导致C中的分段错误?

    我正在学习一些有关汇编和 C 的基础知识 出于学习目的 我决定编写一个禁用中断的简单程序 当用户想要在控制台中输入某些内容时 他 她不能 include
  • 以编程方式运行 Spring Batch Job?

    我有一个 Spring Batch 应用程序 我从以下开始CommandLineJobRunner 但现在我必须将此应用程序嵌入到我们的企业环境中 我们有一个自己的启动器应用程序 我必须使用它 对于这个启动器应用程序 我需要一个带有 mai
  • RenderRepaintBoundary 到图像而不将 Widget 添加到屏幕

    我正在尝试从小部件导出图像 而不将此小部件添加到屏幕 这可能吗 我已经通过添加到可滚动容器成功导出它 现在我想渲染它而不将其添加到屏幕并将其保存到临时文件以供共享 我认为那里应该有一个 paint 调用 但无法弄清楚到底在哪里 这是我的代码
  • Swift 算术和比较运算符重载的数字列表?

    文档中是否有一个地方或者我可以在 Xcode 6 中动态查找的地方显示了数字的所有定义的运算符重载 例如二进制算术和比较运算符 Swift 支持所有数字类型的四种标准算术运算符 加法 减法 乘法 分配 Swift 支持所有标准 C 比较运算
  • @Security 注释的自定义消息

    我正在尝试使用 Security我的路线的注释 像这样 return Response Route action Security has role ROLE USER Template public function someAction
  • CGBitmapContextCreate:无效数据字节/行

    我正在尝试在将图像显示回用户之前调整图像大小 我收到的错误是 Error CGBitmapContextCreate invalid data bytes row 对于 8 个整数位 组件 3 个组件 kCGImageAlphaNoneSk
  • 如何将数据从 Flask 发送到 JavaScript?

    你好 我是新人 正在用 Flask 和 Javascript 构建一个应用程序 我在从 Flask do JavaScript 发送数据时遇到问题 我在routes py中有代码 app route mapaa methods GET PO
  • 导入的node_modules css在webpack中不起作用

    我的一个组件中有一个外部 css 导入 import rc slider assets index css 然而 当使用 webpack 构建时 css 没有被注册 我尝试添加以波浪号为前缀的导入 import rc slider asse
  • 如何在同一个 global.asax 中托管 WCF REST 服务和 WCF 数据服务

    我有一个 WCF REST Web 服务 通过 global asax 中的服务路由托管 如下所示 protected override void RegisterRoutes System Web Routing RouteCollect
  • 强制 fputcsv 对 *所有* 字段使用封装

    当我使用fputcsv http php net fputcsv要向打开的文件句柄写入一行 PHP 会向它认为需要的任何列添加一个封闭字符 但会保留其他列而不包含封闭字符 例如 您最终可能会得到这样的行 11 Bob Jenkins 200
  • 为什么 Jenkins 在使用 MSBuild 时忽略 %PATH% 变量?

    我正在尝试使用 Jenkins 编译用 Delphi 创建的 MSBuild 项目 我已将 MSBuild 插件安装到 Jenkins 中并进行配置 我正在为我的构建作业选择特定配置 我已经在 J enkins 中设置了 Delphi 编译
  • MongoDB 架构设计 - 帖子投票

    假设我有一个网站 里面有很多文章 人们可以对他们喜欢的文章进行投票 我希望能够查询得到在一定时间内 最后一小时 最后一天 上周 按票数排序的得票最多的文章 与往常一样 MongoDB 有几种不同的方法来实现这一点 但我不确定哪一种是正确的