Node、MongoDB、Mongoose 设计选择 - 创建两个集合或一个集合
Posted
技术标签:
【中文标题】Node、MongoDB、Mongoose 设计选择 - 创建两个集合或一个集合【英文标题】:Node, MongoDB, Mongoose Design Choice - Creating two collections or one collection 【发布时间】:2013-10-20 20:09:24 【问题描述】:我正在为我的应用程序的 mongo 集合和 mongoose 架构选择大量设计方案而苦苦挣扎。
我的应用程序需要两种帐户类型:学生和教师。
这两种帐户类型之间唯一的相似之处在于它们都需要以下字段:名字、姓氏、电子邮件和密码。除此之外,它们是不同的(老师有“作业”、“测试”,学生有“家庭作业”等)
我已经广泛考虑了我的选择,并考虑了以下设计选择:
使用 mongoose-schema-extend,并为 所有帐户。然后,扩展此模式以创建教师和 学生模式。这意味着两个集合,因此一些 冗余字段。登录和帐户创建也存在问题(检查用于登录的电子邮件是学生电子邮件还是教师电子邮件等)
创建一个集合“accounts”,并添加一个type字段到 指明该帐户是“学生”还是“教师”。这意味着 “帐户”集合中的条目将是不同的。这 还要求我有两个单一的猫鼬模式 收藏。
创建一个“accounts”集合,有一个“type”字段和一个“accountId”字段。除了“学生”集合和“教师”集合之外——“类型”字段将指示学生特定或教师特定字段驻留在哪个集合中,“帐户ID”字段将准确指示帐户的哪个条目匹配。
感谢所有意见、批评或建议。
【问题讨论】:
【参考方案1】:我也曾走上类似的道路,最终我选择了选项 1 和 2。
mongoose-schema-extend
只是使用#extend()
方法修改Schema
的原型,该方法在调用时执行传递模式的深层复制。最有帮助。但是,您可以通过将collections
属性添加到 Schema 来控制 mongoose 在 MongoDB 中保存到哪个集合:
var schema = new Schema(
foo: String,
bar: Boolean
, collection: "FooBarBaz" );
请记住:Mongoose 了解 Schema 的概念,但 MongoDB 不了解。这意味着您可以存储不同的数据并使用您的自定义业务逻辑来控制混乱。话虽如此,您可以创建一个名为 User
的基础模型,通过使用 collection
选项强制 mongoose 使用相同的集合,然后扩展此基础模型以创建您的 Teachers
和 Students
模型。
确保按照选项 2 中的建议在基本模型中添加 type
标志。这不仅便于快速查找,而且在处理原始 MongoDB 数据的突击队时至关重要。
【讨论】:
【参考方案2】:@jibsales 有一个很好的解决方案。
要考虑的另一种解决方案是使用 Population 并从 Users 集合到 Student 和 Teacher 集合的引用 http://mongoosejs.com/docs/populate.html。一些好处是:
三个集合(用户、教师、学生)中的每个集合中的条目 存储相似。
允许您独立获取“用户”的字段 获取引用集合的字段。
这需要在创建实例之前修改架构(并从架构创建模型),其中 refType 是所需的集合:
var userSchema = new Schema(
_id : Number,
name : String,
age : Number,
stories : [ type: Schema.Types.ObjectId, ref: refType]
);
【讨论】:
以上是关于Node、MongoDB、Mongoose 设计选择 - 创建两个集合或一个集合的主要内容,如果未能解决你的问题,请参考以下文章
?? Mongoose?Node.js?MongodB ?????????????
详解node+mongoose+mongoDb(mongoDb安装运行,在node中链接)
??? MongoDB ??? Node.js ????????? Mongoose ??