gpt4 book ai didi

MongoDB 架构设计 - 帖子投票

转载 作者:行者123 更新时间:2023-12-02 05:20:10 27 4
gpt4 key购买 nike

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

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

与往常一样,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"
}

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

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

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

您将如何实现此架构?

最佳答案

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

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

如果聚合的数量是固定的并且站点非常繁忙,您可以扩展此范例并增加额外的计数器,例如一个月、一天和一小时的计数器,但这可能很快就会失控。因此,您可以使用新的 Aggregation Framework (在 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}
] );

关于MongoDB 架构设计 - 帖子投票,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312419/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com