2013-06-11 5 views
37

저는 Mongoose.js를 사용하여 스키마가있는 모델을 만듭니다.몽구스 모델에서 스키마 속성 가져 오기

필자는 모델 목록 (많은 항목)을 갖고 있으며 때때로 특정 모델을 구성하는 속성/키를 얻고 싶습니다.

주어진 모델에 대한 속성 스키마를 추출하는 방법이 있습니까? 예를 들어

,

var mySchema = module.exports = new Schema({ 
    SID: { 
    type: Schema.Types.ObjectId 
    //, required: true 
    }, 
    teams: { 
    type: [String] 
    }, 
    hats: [{ 
    val: String, 
    dt: Date 
    }], 
    shields: [{ 
    val: String, 
    dt: Date 
    }], 
    shoes: [{ 
    val: String, 
    dt: Date 
    }] 
} 

);

스키마의 속성을 추출/식별 할 수 있습니까? [SID, hats, teams, shields, shoes] ??

답변

50

예, 가능합니다.

paths: { 
    number: [Object], 
    'name.first': [Object], 
    'name.last': [Object], 
    ssn: [Object], 
    birthday: [Object], 
    'job.company': [Object], 
    'job.position': [Object], 
    'address.city': [Object], 
    'address.state': [Object], 
    'address.country': [Object], 
    'address.street': [Object], 
    'address.number': [Object], 
    'address.zip': [Object], 
    email: [Object], 
    phones: [Object], 
    tags: [Object], 
    createdBy: [Object], 
    createdAt: [Object], 
    updatedBy: [Object], 
    updatedAt: [Object], 
    meta: [Object], 
    _id: [Object], 
    __v: [Object] 
} 

당신은 너무 모델을 통해 액세스 할 수 있습니다

각 스키마 (이 내 코드의 예입니다) 다소 같이 보이는 paths 속성이 있습니다. Model.schema.paths 이하입니다.

+0

리소스를 제공 할 수 있습니까? – user1460015

+0

나는 이해하지 못한다. 링크가 필요합니까? – gustavohenke

+4

... 여기에서 질문하는 대신 미래에 참조 할 수있는 것입니다. – user1460015

30

주석을 달 수있는 담당자가 충분하지 않지만 목록을 작성하고 모든 스키마 유형을 반복합니다.

number 
name.first 
name.last 
ssn 
birthday 
job.company 
job.position 
address.city 
address.state 
address.country 
address.street 
address.number 
address.zip 
email 
phones 
tags 
createdBy 
createdAt 
updatedBy 
updatedAt 
meta 
_id 
__v 

또는이 같은 배열로 모든 속성을 얻을 수 :

mySchema.schema.eachPath(function(path) { 
    console.log(path); 
}); 

인쇄한다 lodash에 대한

var props = Object.keys(mySchema.schema.paths); 
+1

이것은 메소드를 포함하여 객체의 모든 속성을 제공하기 때문에 좋지 않습니다! –

6

솔루션, 모든 스키마 속성을 포착 기능, 지정 제외

_.mixin({ pickSchema: function (model, excluded) { 
    var fields = []; 
    model.schema.eachPath(function (path) { 
     _.isArray(excluded) ? excluded.indexOf(path) < 0 ? fields.push(path) : false : path === excluded ? false : fields.push(path); 
    }); 
    return fields; 
    } 
}); 

_.pickSchema(User, '_id'); // will return all fields except _id 

_.pick(req.body, _.pickSchema(User, ['_id', 'createdAt', 'hidden'])) // all except specified properties 

자세히보기 https://gist.github.com/styopdev/95f3fed98ce3ebaedf5c

1

'$ ___'으로 시작하는 ORM의 추가 메소드가 아니라 추가 한 속성 만 사용하려면 문서를 객체로 변환 한 다음 다음과 같은 속성에 액세스해야합니다. 경우

Object.keys(document.toObject()); 
0

당신이 (중첩 및 인구 특성 포함)의 모든 속성 값을 갖고 싶어, 단지 toObject() 방법을 사용하십시오

let modelAttributes = null; 
SomeModel.findById('someId').populate('child.name').exec().then((result) => { 
    modelAttributes = result.toObject(); 
    console.log(modelAttributes); 
}); 

는 출력은 다음과 같습니다

{ 
    id: 'someId', 
    name: 'someName', 
    child: { 
    name: 'someChildName' 
    } 
    ... 
}