多用户账户的 MongoDB/Mongoose 模式

Posted

技术标签:

【中文标题】多用户账户的 MongoDB/Mongoose 模式【英文标题】:MongoDB/Mongoose Schema for Accounts with Multiple Users 【发布时间】:2013-12-11 13:29:38 【问题描述】:

我正在寻找有关我正在考虑的 MongoDB 架构的一些建议。我很想得到一些 cmets 和可能的更正。这将适用于有帐户但每个帐户可以有多个用户/管理员的登录系统。每个用户都有他/她自己的登录名,但我正在考虑将所有内容都嵌入到 Account 文档中。每个帐户不会超过 10 个用户(我认为如果必须有 100 个用户,性能仍然不会受到影响)。这是典型文档的外观。


    id: ObjectId(),
    modified: date,
    users: 
        user@domain.com:
            password: hash
        
    

我不确定是否可以为用户创建类似的子文档,以及通过查找用户的电子邮件和密码来获取帐户信息是否有效。

仍在阅读有关架构设计的信息,但欢迎提供任何反馈。

【问题讨论】:

如果您将用户名存储为字段名称,您将无法进行搜索。做:users: [ login: "user@example.com", pwd: "hash" ]。然后,您可以在users.login 上编制索引以进行快速查找。但是,我不确定我是否会将所有内容都存储在一个文档中,除非我缺少一些好处...... 这里的好处是我需要在用户登录时获取帐户信息,因此查询正在搜索 1 个文档。您仍然建议将它们分成单独的集合吗? 如果这就是过去使用它的方式,那么作为一个文档是有意义的。 【参考方案1】:

对于这种情况,我更喜欢嵌入而不是链接。您的场景非常适合嵌入。我会创建 2 个模型。其中一个是Account,另一个是User。单独定义用户模型的原因是定义您的用户模型行为。假设您正在使用注册表单将用户添加到指定帐户。当您发布表单时,您可以直接将表单正文发布值转换为 User 模型并将其嵌入到 Account 模型中。我创建了类似的模型;

Account = new Schema(
    users:
        type:[User],
        required:true
    ,
    modified:
        type:String,
        required:false
    
);

User = new Schema(
    name:
        type:String,
        required:true
    ,
    email:
        type:String,
        required:true
    ,
    password:
        type:String,
        required:true
    
);

您还可以查看 gist here 例如定义。

【讨论】:

如果用户被允许属于多个帐户,这将无法正常工作,所以我现在坚持使用链接。 您可以将用户嵌入到多个帐户中 是的,但是如果有关用户的任何信息发生更改,则需要更新每个帐户。

以上是关于多用户账户的 MongoDB/Mongoose 模式的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB/Mongoose:多对多关系

使用嵌套字段在MongoDB / Mongoose中创建多对多关系?

如何使用用户名和密码连接 mongodb(mongoose)?

MongoDB/Mongoose 一对多,在子节点中引用父节点 - 分组并加入

如何在 mongodb / mongoose 中使用“$text query and $or”进行多文本搜索?

Mongodb/Mongoose:为用户帐户创建两种类型的模型