2016-07-28 2 views
1

Mongo에서 첫 번째 데이터베이스를 개발 중입니다. Mongoose를 사용하여 모델을 만듭니다. 여러 관계를 하나씩 구현하고 싶습니다. 세 가지 모델이 있습니다 : 사용자, 그룹 및 역할 모델. 사용자는 여러 그룹에 속할 수 있으며 동일한 그룹에 여러 역할을 가질 수 있습니다. 예를 들어, John은 그룹 1과 2에 속해 있습니다. 그룹 1의 Juan은 관리자이고 그룹 2는 관리자와 수퍼 유저입니다. 내가 관계형 스키마를 보여 아래 :Nodejs : MongoDB의 복수 대다수

UserModel

const roleSchema = new Schema({ 
     name: {type: String, unique: true}, 
     code: {type: String, unique: true}, 
     description: String 
    }, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
    }); 
    const RoleModel=mongoose.model('role', roleSchema); 

const userSchema = new Schema({ 
     username: {type: String, unique: true}, 
     first_name: String, 
     middle_name: String, 
     first_surname: String, 
     second_surname: String, 
     email: String, 
     password: String 
    }, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
    }); 
    const UserModel = mongoose.model('user', userSchema); 

역할 모델을 :

Schema relational

을 나는 후속 모델을 만들 수 있습니다

GroupModel

const groupSchema = new Schema({ 
     name: {type: String, unique: true} 
    }, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
    }); 
const GroupSchema = mongoose.model('group', groupSchema); 

GroupUserRoleModel

const groupuserroleSchema = new Schema({ 
    role: {type: Schema.Types.ObjectID, ref: 'role'}, 
    user: {type: Schema.Types.ObjectID, ref: 'user'}, 
    group: {type: Schema.Types.ObjectID, ref: 'group'} 
}); 
const GroupUserRoleModel = mongoose.model('group_user_role', groupuserroleSchema); 

내 질문은 :

  1. 이 확인을 구현?
  2. GroupUserRole 문서를 만들려면 어떻게해야합니까? 나는 방법에 대한 정보를 볼 수있다

는 몽구스 (Populate)에 채울 수 있지만 두 모델 도와 감사 사이에 하나의 관계 우주선이있다.

답변

1

Modelization

좋아, 여기에 질문은, 당신은 MongoDB의를 사용하여 - 유사 "관계형 데이터베이스"를 만들거나 데이터베이스 - 유사 "NoSQL에"를 modelize 싶어합니까?

관계형 스키마를 재현하면서 수행하려는 작업을 확인합니다. 이것은 흔히 볼 수있는 실수이며, 여기 왜 이것을 피해야하는지에 대한 설명이 있습니다. mongodb를 사용하면, 새로운 관계 (1 대 1, 다수 대 일부)와 같이 알고 있어야하는 새로운 개념이 있습니다. some은 소수의 문서 그룹 /리스트를 나타냅니다 (우리는 그 하위 문서를 호출 할 수 있습니다). mongodb의 가장 큰 장점은 가능한 경우 수집을 줄이는 것입니다. 당신은 몽구스의 방법 하위 문서 작업에 대한 설명을 원하는 경우에

, 여기에 (당신은 내가 생각하지 많은 그룹 및 역할이있는 경우), 나는, 당신이해야한다고 생각 http://mongoosejs.com/docs/subdocs.html

이 문제를 해결하려면 링크입니다 그 :

UserModel

const roleSchema = new Schema({ 
     name: {type: String, unique: true}, 
     code: {type: String, unique: true}, 
     description: String 
}, { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
}); 

const groupSchema = new Schema({ 
    name: {type: String, unique: true} 
}, { 
    timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
}); 

const userSchema = new Schema({ 
    username: {type: String, unique: true}, 
    first_name: String, 
    middle_name: String, 
    first_surname: String, 
    second_surname: String, 
    email: String, 
    password: String, 
    roles: [roleSchema], 
    groups: [groupSchema] 
}, { 
    timestamps: {createdAt: 'created_at', updatedAt: 'updated_at', deleteAt: 'delete_at'} 
}); 
const UserModel = mongoose.model('user', userSchema); 

그리고 지금 당신은 하나의 콜렉션은 사용자 자신의 그룹과 역할을 관리 할 수있는 '사용자'이있다.

사용

var user = new UserModel({ name: "Odonno", groups: [{ name: 'Admin' }, { name: 'User' }] }) 
user.save(callback); 

당신은 당신의 모델이되면, 당신은 쉽게 그룹 및 역할을 설정 한 후 데이터베이스에 저장할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 하지만 다음 질문이 있습니다. Odonno와 1000 명의 사용자가 그룹 1과 그룹 2에 더 많이 속한다고 상상해보십시오. 그룹 1에서 모든이 사용자는 관리자 및 사용자 역할을 담당하고 그룹 2는 관리자 역할 만 담당합니다. 그룹 1의 역할을 업데이트하려는 경우 (예 : 사용자 역할 삭제) 모든 사용자로 이동하여 그룹 1에 속하는지 그리고 사용자 역할이 있는지 확인해야합니다. 이 게시물에 따르면 http://stackoverflow.com/questions/5373198/mongodb-relationships-embed-or-reference), 내 모든 관계가 다른 것에 의존하기 때문에 나는 포함하지 말고 참조를 사용해야한다고 생각합니다. – arisolarpower

+0

분명히 그것은 당신의 필요에 달려 있습니다. Group과 Role 사이에 의존성이 있다면 그룹에 대한 콜렉션을 생성하고 그룹 문서의 objectId를 사용하는 것이 더 재미 있습니다. 여기에 좋은 예가 있습니다. http://mongoosejs.com/docs/2.7.x/docs/populate.html – Odonno

+0

시간 내 주셔서 감사 드리며 많은 도움을 받았습니다. – arisolarpower