Art*_*kel 3 javascript mongoose mongodb mean-stack
我花了一些时间研究MongoDB替代方案,以实现多对多关系,包括几个stackoverflow文章(这里和这里)和这些幻灯片.
我正在使用MEAN堆栈创建一个应用程序,我正在尝试确认我的架构设置和取消引用对象集合的最佳实践.
我在用户和会议之间有一个基本的多对多关系(考虑为用户安排会议,其中用户可以在许多会议中,会议包含多个用户).
鉴于我的用例,我认为最好使用引用而不是嵌入.我相信(从我读过的内容),只有当我的会议有一个会议独有的用户时才使用嵌入会更好.就我而言,这些相同的用户在会议中共享.此外,虽然更新用户很少(例如,更改用户名,密码),我仍然觉得使用参考感觉是正确的 - 虽然我对意见持开放态度.
假设我使用了引用,我有以下(简化)模式:
var MeetingSchema = new Schema({
description: {
type: String,
default: '',
required: 'Please fill in a description for the meeting',
trim: true
},
location: {
type: String,
default: '',
required: 'Please fill in a location for the meeting',
trim: true
},
users: [ {
type: Schema.ObjectId,
ref: 'User'
} ]
});
var UserSchema = new Schema({
firstName: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your first name']
},
lastName: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your last name']
},
email: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your email'],
match: [/.+\@.+\..+/, 'Please fill a valid email address']
},
username: {
type: String,
unique: true,
required: 'Please fill in a username',
trim: true
},
password: {
type: String,
default: '',
validate: [validateLocalStrategyPassword, 'Password should be longer']
}
});
Run Code Online (Sandbox Code Playgroud)
首先,您会注意到我没有在用户中收集会议.我决定不添加此集合,因为我相信我可以使用MongoDB find的功能来获取与特定用户相关的所有会议 - 即,
db.meetings.find({users:ObjectId('x123')});
Run Code Online (Sandbox Code Playgroud)
当然我需要添加一些索引.
现在,如果我想在特定会议上尊重我的用户,我该怎么做?对于那些了解rails并且知道不同之处的人:include和:join我正在寻找类似的概念.我知道我们不是在处理MongoDB中的连接,但是对于我来说,为了从会议中取消引用用户集合以获取用户的名字和姓,我需要循环遍历id的集合并执行某种类型的db.每个id的users.find().我假设有一些简单的MongoDB调用,我可以通过高效的方式实现这一点.
| 归档时间: |
|
| 查看次数: |
1163 次 |
| 最近记录: |