为每个用户使用新集合
Posted
技术标签:
【中文标题】为每个用户使用新集合【英文标题】:Using new collections for each user 【发布时间】:2022-01-13 08:08:03 【问题描述】:我正在使用 Node.js 构建一个费用跟踪应用程序,其中所有收入和成本都应该保存在数据库中。
我的想法是为每个注册用户创建一个新集合,并将他们所有的收入/成本操作保存在该集合中。
在写之前我想考虑的事情是:
如何命名集合 这种方法的效率 它是否安全 当他们从其他设备登录时,我如何保存他们的数据 两个用户是否可以拥有相同的集合名称,从而导致他们将操作保存在一个集合中 有没有更好的方法来做到这一点我想解决这个问题的方法是制作一个模型,该模型采用给定的公司/用户名来创建一个集合。
const mongoose = require('mongoose');
const bcrypt = require ('bcrypt');
const Schema = mongoose.Schema;
const UserSchema = new Schema(
userName:
type: String,
required: true,
unique: true
,
userPass:
type: String,
required: true
,
userEmail:
type: String,
required: true,
unique: true
, timestamps: true );
UserSchema.pre('save', async function (next)
try
const hashed = await bcrypt.hash(this.userPass, 10)
console.log('saved user with hashed password.')
this.userPass = hashed
next();
catch
next(error)
)
const User = mongoose.model(userName, UserSchema);
module.exports = User;
只有拥有该唯一名称密码的人才能访问该集合。
所以我想问的是:有没有更好的方法来做到这一点?
【问题讨论】:
1.集合是多个文档的集合,您的意思是您要为每个用户创建一个文档,存储在User
集合中。 2. unique
约束使得不可能有两个相同的名字。当您尝试保存重复名称时请注意,mongo 将通过您重复错误而不保存它。 3.您所做的很好,为引用用户的费用创建一个集合,为用户创建一个集合(就像您已经拥有的那样),或者您将费用作为嵌套集合存储在用户内部,反之亦然;)跨度>
所以你说我应该做两个系列。一种用于用户,另一种用于费用,其中每个文档都引用了用户。嗯,这比我想的要容易得多,非常感谢。 :)
没错,然后当您想要一个用户的所有费用时,您可以进行 mongodb 调用,例如 Expenses.find(personThatMadeTheExpense: userId)
【参考方案1】:
问题在于我试图保存收入/支出行为的方式。 我的想法是为每个用户制作一个单独的集合,这需要我将每个集合命名为唯一的。 据我了解,它也不容易大规模管理,因为每个用户都应该拥有自己的集合最多可以堆叠数百个集合。
就像 Maximilian 提到的那样,为所有收入/支出操作创建一个集合并将每个文档引用给特定用户会更加容易和管理。
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于为每个用户使用新集合的主要内容,如果未能解决你的问题,请参考以下文章
Groovy集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )