mongodb - 如何使用 MongoDB 设计是/否投票系统?

标签 mongodb mongodb-query database-schema

我需要设计我的 mongodb 数据库的架构,并且我想选择最好的架构。我有一个项目集合 (ITEMS),并且每个人都可以对其中任何项目进行投票(是或否)

一个项目可以有很多票(大约 10000 票,但最多可以达到 100000 票甚至更多)。现在我必须在哪里存储选票?在这样的项目中:

ITEMS: {
  _id: int32, // id of the item
  ...
  vote_yes:[int32], // the ids of people who vote yes
  vote_no:[int32], // the ids of people who vote no
  ...
}

但这会使我的项目集合中的文档有点大(例如,有 100 000 票,一个文档可能需要大约 500 kb!但我不知道这是否重要,以及真正的后果是什么)。或者我可以将投票存储在专门用于投票的不同集合中(我仅将其用于投票,因此大小并不重要):

VOTES: {
  _id: int32, // id of the item
  vote_yes:[int32], // the ids of people who vote yes
  vote_no:[int32], // the ids of people who vote no
}

但问题是过滤器! 我需要从项目中检索文档,其中vote_yes 不包含我的 ID,vote_no 不包含我的 ID 以及一些专用于项目的附加过滤器(例如本地化)。我认为在 mongodb 中进行连接会很轻松,而且效率不高

所以这就是我所在的位置,选择什么模式? 预先感谢您的帮助!

最佳答案

我建议您将投票存储在单独集合中的单独文档中。

原因是不断增长的文档对于 MongoDB 来说是有问题的,因为每次文档增长到初始大小的两倍时,都需要将其移动到数据库文件中的不同位置。这会减慢写入速度。

但是,当您单独存储投票时,您可以轻松进行其他查询,例如查找特定用户的投票统计信息。它还使您可以选择存储更多投票元信息,例如投票日期。

示例:

{
    item: [itemId],
    user: [userId],
    vote: [1 or -1],
    date: [ISODate]
}

作为索引,我建议在 { item:1, user:1} 上使用 unique:true 的复合索引,以防止重复投票。该索引还将加快项目的计票速度。仅针对用户的附加索引可以快速获取特定用户的投票也可能很有用。

缺点是获取特定问题的投票计数需要您对投票集合进行 .count 。因此,您可能会考虑在项目文档中保留当前投票计数的副本。

关于mongodb - 如何使用 MongoDB 设计是/否投票系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810760/

相关文章:

json - 将硬编码属性添加到 json 输出

java - 使用 Java 从 mongoDB 检索文档数组

node.js - 无法使用 $project 获取特定的数据库值

sql-server - SQL Server 数据库架构版本控制和更新

java - Spring聚合框架: How to create nested $divide, $subtract,$mod查询?

javascript - 我如何使用 Node 异步来获取我的 Mongoose 调用?

database - 除了明显的 - 为什么 Oracle 对象变得未编译

mysql - 连接表或为几行创建列

c# - Mongodb C# 按日期时间属性过滤

python - 如何在 Pymongo 中获取输入