gpt4 book ai didi

node.js - 短信 API 的最佳 mongodb 集合设计

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:21 25 4
gpt4 key购买 nike

我正在使用 Node js 和 mongoose 开发短信 API,但我对 mongodb 还很陌生,所以我想问你什么是最适合我的问题的数据库设计。我的 api 包含一个 http 接口(interface),客户端将使用该接口(interface)发送短信。因此,客户端将在数据库中拥有一个用户帐户,并且每个月每小时的短信数量有限等。因此,每次客户端尝试发送短信时,都会对客户端之前所有短信的日期和时间进行计算,以便定义他是否有权发送新短信。所以我能想到的不同的集合设计是:

  • 在用户集合中使用一个数组,该数组将包含特定用户的每个短信对象。架构中类似的东西sms_sent:[{地址:'XXXXX',sent_date:'2017-05-05 00:01:33'}]。有了这样的集合,计算将变得简单快捷,但是当我想做一个全局报告时,例如获取所有用户在过去一小时发送的短信数量,我认为它可能会非常缓慢和困难。

  • 使用不同的短信集合来存储短信数据和发送短信的用户的用户 ID。这样的话,计算某个用户每次尝试发送短信时发送的短信数量不是很关键吗?

  • 使用不同的短信集合,并且仅将用户发送的短信的ObjectId存储在用户集合中(sms_sent: [ ObjectId('XXXX'), ObjectId('XXXX')]。我不知道这个解决方案是否有效。

所以我想知道什么是最有效的解决方案,该解决方案将导致更快的计算和请求。如果您有其他解决方案,我想知道。预先感谢您的回复。

最佳答案

我建议您保留短信收集,但也将短信统计信息保留在用户收集中。方法如下:

var smsSchema = new Schema({
text: {type: String, required: true},
user: {type: Schema.Types.ObjectId, ref: 'User'},
sentAt: {type: Date, default: Date.now}
});


var userSchema = new Schema({
name: {type: String, required: true},
sms : {
subscribed : {type: Boolean, required: true, default: false},
cellNo : {type: String},
month : {
current: {type: Number}, // 01 (Jan)
limit: {type: Number}, // 2000
sent: {type: Number}, // 1135
},
hour : {
current: {type: Number}, // e.g. 23 (11 pm)
limit: {type: Number}, // 200
sent: {type: Number}, // 157
}
},

createdAt: {type: Date, default: Date.now},
updatedAt: {type: Date, default: Date.now},
});

现在,每当用户发出短信请求时:

  1. 获取用户文档
  2. 查找当前月份并将其与 user.sms.month.current 相同(比如 01 表示 Januray)
  3. 如果 2 为 true,则检查 user.sms.month.sent 是否小于每月limit user.sms.month.limit(您将在订阅)
  4. 如果 3 为 true,则发送短信,创建短信文档,并将 user.sms.month.sent 加 1
  5. 如果 3 为 false,则返回一些“已达到每月限额”消息
  6. 如果 2 为 false,请将 user.sms.month.current 设置为当前月份,将 user.sms.month.sent 设置为 0,然后执行第 4 步

user.sms.hour 字段应用相同的步骤。

这样您只需要用户的单个文档即可识别他的请求是否被授权。您还可以在单​​独的集合中记录每条短信。

关于node.js - 短信 API 的最佳 mongodb 集合设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868776/

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