2014-11-13 2 views
5

내가 MongoDB를/노드를 배우려고 노력하고있어 나는 스키마에 나는 종종 이런 걸 볼 것으로 나타났습니다 :몽구스 toObject : {virtuals에 : TRUE}

toObject: { virtuals: true } 
toJSON: { virtuals: true } 

이 두 선은 무엇을 의미합니까를?

+0

여기서 일반적인 관행은 도움이되는 답변을 "수락하는"것입니다. 그것은 대답 등급 번호 옆에 큰 "진드기"입니다. 당신이 묻는 모든 질문에 대한 단 하나의 대답을 받아들이지 않았기 때문에 이것을 말하십시오. 그들은 모두 잘못 될 수는 없으므로 받아 들여야합니다. –

+0

이 옵션에 대한 [documentation] (http://mongoosejs.com/docs/guide.html#toJSON)을 읽으셨습니까? – JohnnyHK

답변

8

"MongoDB"가 아니라 몽구스 ODM에만 해당됩니다.

몽구스에는 스키마 정의에 "virtual" 필드의 개념이 있습니다. 이것은 본질적으로이 (문서에서 노골적인 이삭) 수 :

var personSchema = new Schema({ 
    name: { 
     first: String, 
     last: String 
    } 
}); 

var Person = mongoose.model("Person", personSchema); 

을하지만 당신은 단지에 "저장"이러한 속성을 원하지만 다음 "전체 이름"이라는 코드에 액세스 할 수있는 뭔가가 있다고 가정합니다.

personSchema.virtual("name.full").get(function() { 
    return this.name.first + ' ' + this.name.last; 
}); 

이제 우리는 같은 것을 수행 할 수 있습니다 : "virtuals에"이 들어올 곳입니다

var bad = new Person({ 
    name: { "first": "Walter", "last": "White" } 
}); 

console.log("%s is insane", bad.name.full); // Walter White is insane 

는 그래서 name.full 실제로 데이터가 존재하지 않습니다, 그것은 코드의 단지 스키마 표현입니다. 물론 메서드의 코드 당 두 필드를 결합하는 값을 반환하는 메서드를 만들기 위해 개체에있는 실제 데이터를 사용하는 함수에 "묶여"있습니다.

이것은 기본적으로 "가상"필드에 관한 것입니다. 사실 "데이터베이스"에 저장되거나 지속되지 않는 값을 제시하는 "객체"문서에 정의 된 "메소드"입니다. 일반적으로 데이터 저장소의 실제 지속 값을 기반으로합니다.

하지만 직접적인 질문을 정리하십시오. Mongoose는 기본적으로 "저장된"필드를 기반으로 내부 객체 구조의 내용 만 '직렬화'합니다. 그래서 그 두 줄은 "정말"평균 무엇 :

  1. toObject() : 이것은 다른 모든 "몽구스 마법"부분없이 오브젝트 데이터의 "일반"또는 "원시"표현을 생산 확장 된 개체. 그러나 "가상"의 목적은 반환 된 객체의 일부로 해당 메소드를 만드는 것입니다. 기본적으로 그냥 일반 객체는 전화로 :

    var model = Model.new({ "name": { "first": "Walter", "last": "White" }); 
    console.log(model.toObject()); 
    
  2. toJSON() : 위의 그림과 같이 명시 적으로 그냥이 메소드를 호출 할 수 있지만, 가장 일반적인 사용 같은이 곳 아래에 JSON 파서에서입니다입니다 암시 적으로 호출됩니다. 위와 같은 원칙이 적용됩니다. 따라서 후자의 경우 객체에 .toJSON() 방법의 "암시"통화가

    var model = Model.new({ "name": { "first": "Walter", "last": "White" }); 
    JSON.stringify(model, undefined, 2); 
    

다음 "virtuals에"는 같은 직렬 출력 이러한 방법의 결과를 포함한다. 구성에서 수행하는 작업은 해당 메서드가 객체에있는 데이터 또는 "필드"뿐만 아니라 정의 된 "가상"메서드 및 해당 출력도 포함되도록하는 것입니다. .toObject()과 동일합니다.

+0

고맙습니다.하지만 "set ('toObject': {virtuals : true})가 정확히 무엇입니까? 나는 가상의 개념을 얻지 만, 당신은 단지 'toObject'라는 객체 키를 설정하고 그것을 객체 데이터 가상으로 설정 한 것처럼 보입니다. 사실, 여기에서 성취하려는 것은 무엇입니까? – saeho

+0

toObject() 및 toJSON()에 대한 설명을 편집 해 주셔서 감사합니다. – saeho

+0

toObject undefined – John