복붙노트

[MONGODB] 왜 몽구스는 스키마와 모델 모두이 있습니까?

MONGODB

왜 몽구스는 스키마와 모델 모두이 있습니까?

객체의 두 종류가 너무 가까이 서로에게 모두를 가진 것은 중복 느끼는 것 같다. 스키마와 모델을 모두 가지고있는 점은 무엇인가?

해결법

  1. ==============================

    1.이 유형의 질문에 대답하는 것이 가장 쉬운 방법은 예제입니다. 이 경우, 누군가가 이미 나를 위해 그것을 수행했다 :)

    이 유형의 질문에 대답하는 것이 가장 쉬운 방법은 예제입니다. 이 경우, 누군가가 이미 나를 위해 그것을 수행했다 :)

    여기를보세요 :

    http://rawberg.com/blog/nodejs/mongoose-orm-nested-models/

    편집 : 나는 아래를 재현하고 있으므로 원래의 게시물은 (코멘트에서 언급 한 바와 같이) 더 이상 존재하는 것 같다. 그것은 이제까지 반환, 또는 방금 이동 한 경우, 알려 주시기 바랍니다해야합니다.

    이 스키마가있는 동안 어떻게 모델을 통해 작업을 밀어 또한 쇼 몽구스의 모델 내에서 스키마를 사용하여 왜 당신이 그것을하고 싶은 것, 그리고 괜찮은 설명을 제공 등 구조에 대한 모든

    원래 포스트 :

    의이 모델의 내부 스키마를 삽입하는 간단한 예제부터 시작하자.

    var TaskSchema = new Schema({
        name: String,
        priority: Number
    });
    
    TaskSchema.virtual('nameandpriority')
        .get( function () {
            return this.name + '(' + this.priority + ')';
        });
    
    TaskSchema.method('isHighPriority', function() {
        if(this.priority === 1) {
            return true;
        } else {
            return false;
        }
    }); 
    
    var ListSchema = new Schema({
        name: String,
        tasks: [TaskSchema]
    });
    
    mongoose.model('List', ListSchema);
    
    var List = mongoose.model('List');
    
    var sampleList = new List({name:'Sample List'});
    

    나는 작업이있을 수 있습니다 기본 정보와 함께 새로운 TaskSchema 객체를 만들었습니다. 몽구스 가상 속성은 편리하게 작업의 이름과 우선 순위를 결합하는 설정입니다. 나는 단지 여기에 게터를 지정되었지만 가상 세터도 지원됩니다.

    나는 또한 방법이 설정 작업 방법을 보여 isHighPriority라는 간단한 작업 방법을 정의했다.

    ListSchema 정의에서는 작업 키 TaskSchema 객체의 배열을 유지하도록 구성하는 방법을 알 수 있습니다. 작업 키가 포함 된 몽고 문서를 처리하기위한 특별한 방법을 제공 DocumentArray의 인스턴스가 될 것이다.

    지금 나는 단지 mongoose.model에 ListSchema 객체를 전달하고 TaskSchema을 떠났다. 기술적으로는 우리가 자신의 컬렉션을 저장되지 않기 때문에 정식 모델로 TaskSchema를 설정하는 필요는 없습니다. 나중에 나는에 당신이 할 경우 아무 해를 끼치 지 않는 방법을 보여 줄게 그리고 그들이 여러 파일에 걸쳐 시작, 특히 같은 방법으로 모든 모델을 구성하는 데 도움이 될 수 있습니다.

    목록 모델 설정으로의 그것에 몇 가지 작업을 추가하고 저장 몽고에 수 있습니다.

    var List = mongoose.model('List');
    var sampleList = new List({name:'Sample List'});
    
    sampleList.tasks.push(
        {name:'task one', priority:1}, 
        {name:'task two', priority:5}
    );
    
    sampleList.save(function(err) {
        if (err) {
            console.log('error adding new list');
            console.log(err);
        } else {
            console.log('new list successfully saved'); 
        }
    });
    

    우리의 목록 모델 (에서는 SimpleList)의 인스턴스의 작업 속성은 일반 자바 스크립트 배열처럼 작동하고 우리는 푸시를 사용하여 새로운 작업을 추가 할 수 있습니다. 주의 사항 중요한 점은 일반 자바 스크립트 객체로 작업이 추가됩니다. 그것은 바로 직관적하지 않을 수 있습니다 미묘한 차이입니다.

    당신은 새 목록 및 작업이 몽고에 저장되었다는 몽고 쉘에서 확인할 수 있습니다.

    db.lists.find()
    { "tasks" : [
        {
            "_id" : ObjectId("4dd1cbeed77909f507000002"),
            "priority" : 1,
            "name" : "task one"
        },
        {
            "_id" : ObjectId("4dd1cbeed77909f507000003"),
            "priority" : 5,
            "name" : "task two"
        }
    ], "_id" : ObjectId("4dd1cbeed77909f507000001"), "name" : "Sample List" }
    

    이제 우리는 그 작업을 통해 샘플 목록 및 반복 처리를 끌어 ObjectId가 사용할 수 있습니다.

    List.findById('4dd1cbeed77909f507000001', function(err, list) {
        console.log(list.name + ' retrieved');
        list.tasks.forEach(function(task, index, array) {
            console.log(task.name);
            console.log(task.nameandpriority);
            console.log(task.isHighPriority());
        });
    });
    

    당신이 코드의 마지막 비트를 실행하는 경우에는 포함 된 문서가 방법 isHighPriority이없는 말하는 오류가 발생합니다. 몽구스의 현재 버전에서 직접 포함 된 스키마의 메소드를 액세스 할 수 없습니다. 이 그것을 해결하기 위해 오픈 티켓의와 몽구스 Google 그룹에 질문을 포즈 후, manimal45 지금은 사용에 도움이되는 해결 방법을 기록했다.

    List.findById('4dd1cbeed77909f507000001', function(err, list) {
        console.log(list.name + ' retrieved');
        list.tasks.forEach(function(task, index, array) {
            console.log(task.name);
            console.log(task.nameandpriority);
            console.log(task._schema.methods.isHighPriority.apply(task));
        });
    });
    

    당신이 그 코드를 실행하면 명령 줄에 다음과 같은 출력을 볼 수 있습니다.

    Sample List retrieved
    task one
    task one (1)
    true
    task two
    task two (5)
    false
    

    그 해결 방법을 염두에로의는 몽구스의 모델로 TaskSchema을 돌려 보자.

    mongoose.model('Task', TaskSchema);
    
    var Task = mongoose.model('Task');
    
    var ListSchema = new Schema({
        name: String,
        tasks: [Task.schema]
    });
    
    mongoose.model('List', ListSchema);
    
    var List = mongoose.model('List');
    

    태스크 스키마 정의는 내가 그것을 왼쪽 있도록 이전과 동일합니다. 자신이 모델로 전환되면 우리는 여전히 점 표기법을 사용하여 기본 스키마 객체에 액세스 할 수 있습니다.

    의 새로운 목록을 만들어 보자 그 안에서 두 개의 작업 모델 인스턴스를 포함.

    var demoList = new List({name:'Demo List'});
    
    var taskThree = new Task({name:'task three', priority:10});
    var taskFour = new Task({name:'task four', priority:11});
    
    demoList.tasks.push(taskThree.toObject(), taskFour.toObject());
    
    demoList.save(function(err) {
        if (err) {
            console.log('error adding new list');
            console.log(err);
        } else {
            console.log('new list successfully saved'); 
        }
    });
    

    우리는 우리가 일반 자바 스크립트로 데이터를 변환하는 그들에 toObject를 호출하고있는 목록에 작업 모델 인스턴스를 내장하고 같이 List.tasks DocumentArray 기대되는 객체. 때를 모델 인스턴스 저장 임베디드 문서하며 Object가 포함됩니다 이런 식으로.

    전체 코드 예제 요지로 사용할 수 있습니다. 희망이 작업 차선책 도움이 몽구스가 개발을 계속하는 동안 일을 부드럽게. 나는 아직도 몽구스와 MongoDB를 꽤 새로운 해요 그래서 코멘트에 더 나은 솔루션과 팁을 공유 주시기 바랍니다. 해피 데이터 모델링!

  2. ==============================

    2.스키마는 MongoDB를 모음에 저장됩니다 모든 문서의 구조를 정의하는 객체이다; 그것은 당신의 데이터 항목의 모든 종류와 유효성 검사기를 정의 할 수 있습니다.

    스키마는 MongoDB를 모음에 저장됩니다 모든 문서의 구조를 정의하는 객체이다; 그것은 당신의 데이터 항목의 모든 종류와 유효성 검사기를 정의 할 수 있습니다.

    모델은 컬렉션을 조회하고 해당 컬렉션에 저장 문서를 검증하기 위해 스키마를 사용할 수 있도록, 당신에게라는 이름의 컬렉션에 쉽게 액세스 할 수 있습니다 개체입니다. 그것은 스키마하는 연결 및 컬렉션 이름을 결합하여 생성됩니다.

    원래 발레리 카르 폽, MongoDB를 블로그로 표현한

  3. ==============================

    3.내가 허용 대답이 실제로 제기 된 질문에 대한 대답 생각하지 않습니다. 몽구스는 스키마와 모델의 변수를 모두 제공하는 개발자를 필요로하기로 결정했다 왜 대답은 설명하지 않습니다. 그들은 데이터 스키마를 정의하는 개발자에 대한 필요성을 제거 한 프레임 워크의 예는 장고입니다 - 개발자가 models.py 파일에 자신의 모델을 기록하고 프레임 워크에 잎이 스키마를 관리 할 수 ​​있습니다. 장고와 내 경험에 주어진 그들이 이렇게하는 이유에 대해 생각 나는 첫 번째 이유는, 사용 편의성이다. 아마도 더 중요한 DRY는 (자신을 반복하지 않는) 원칙이다 - 당신이 모델을 변경할 때 스키마를 업데이트 기억할 필요가 없습니다 - 장고 당신을 위해 그것을 할 것입니다! 또한 레일 당신을 위해 데이터의 스키마를 관리 - 개발자가 스키마를 직접 편집하지 않지만, 스키마를 조작 마이그레이션을 정의하여 변경합니다.

    내가 허용 대답이 실제로 제기 된 질문에 대한 대답 생각하지 않습니다. 몽구스는 스키마와 모델의 변수를 모두 제공하는 개발자를 필요로하기로 결정했다 왜 대답은 설명하지 않습니다. 그들은 데이터 스키마를 정의하는 개발자에 대한 필요성을 제거 한 프레임 워크의 예는 장고입니다 - 개발자가 models.py 파일에 자신의 모델을 기록하고 프레임 워크에 잎이 스키마를 관리 할 수 ​​있습니다. 장고와 내 경험에 주어진 그들이 이렇게하는 이유에 대해 생각 나는 첫 번째 이유는, 사용 편의성이다. 아마도 더 중요한 DRY는 (자신을 반복하지 않는) 원칙이다 - 당신이 모델을 변경할 때 스키마를 업데이트 기억할 필요가 없습니다 - 장고 당신을 위해 그것을 할 것입니다! 또한 레일 당신을 위해 데이터의 스키마를 관리 - 개발자가 스키마를 직접 편집하지 않지만, 스키마를 조작 마이그레이션을 정의하여 변경합니다.

    내가 몽구스는 스키마와 모델을 분리하는 것을 이해할 수있는 이유 중 하나는 두 개의 스키마에서 모델을 구축 할 것입니다 인스턴스입니다. 당신은 하나 개의 모델에 의해 관리되는 두 가지 스키마가있는 경우, 왜 하나의 스키마되지 않습니다 - 가치 관리가보다 이러한 시나리오는 복잡성을 소개 하는가?

    아마도 원래의 문제는 기존의 관계형 데이터베이스 시스템의 많은 유물이다. 세계 NoSQL에 / 몽고의 세계에서, 아마도 스키마의 MySQL / PostgreSQL을보다 약간 더 유연하고, 따라서 스키마를 변경하는 것이 더 일반적이다.

  4. ==============================

    4.간단하게 말하면,

    간단하게 말하면,

    당신이 데이터베이스에 어떤 데이터가 관계의 유형에 저장하는 종류의 데이터를 얼마나 MVC 디자인 pattern.It의 정의하는 구조에서 찾을 것 같은 모델은 데이터 객체 모델이다.

    스키마는 데이터베이스 스키마처럼, 데이터베이스에 저장됩니다 무엇의 정의.

  5. from https://stackoverflow.com/questions/9127174/why-does-mongoose-have-both-schemas-and-models by cc-by-sa and MIT license