gpt4 book ai didi

javascript - 设计 MongoDB 数据库 - 许多嵌入式文档可以吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:46 24 4
gpt4 key购买 nike

我正在尝试为一个简单的投票系统创建一个 MongoDB 数据库。如果我要绘制一个架构,那么它看起来像这样:

User {
name: String
, email: String
}

Vote {
message: String
, voters: [ObjectId(User._id)]
}

当有很多选民投一票时,我对这个设计有一些疑问:

  1. 将整个选民数组发送到客户端(更不用说将其缓存在内存中)非常昂贵,对吧?有没有办法以“浅”的方式获得投票,这样当我需要 vote.voters 时,它就会向选民数组发出另一个数据库请求?
  2. 如果选民已经投票,我想检查一下,而不是计算他的选票。为此,我是否可以在嵌入式选民数组中运行一个查询来快速找到它?
  3. 在显示投票时,我希望显示票数,而不将选民数组提取到客户端。我可以运行某种计数查询来计算选民的长度吗?

最佳答案

我会在架构中添加一些冗余,以避免您提到的一些潜在问题。我假设您想要 1) 快速计算票数,2) 确保用户不能投票两次。

实现此目的的一种方法是保留用户列表和投票计数,并在更新查询中添加一个子句,以确保仅在用户 ID 不在投票者列表中时才添加投票:

var query = {_id: xyz, voters: {$ne: user_id}
var update = {$inc: {votes: 1}, $push: {voters: user_id}}
db.votes.update(query, update, true)

(最后一个参数是upsert,Mongo的一个非常好的功能)

然后,如果您想显示投票数,可以将结果的属性限制为 votes 属性:

db.votes.find({_id: xyz}, {votes: true})

您可以在这里找到或多或少准确说明您想要执行的操作的完整说明:http://cookbook.mongodb.org/patterns/votes/

关于javascript - 设计 MongoDB 数据库 - 许多嵌入式文档可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5308906/

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