복붙노트

[MONGODB] 몽구스 모델에서 스키마 특성을 받고

MONGODB

몽구스 모델에서 스키마 특성을 받고

나는 스키마와 모델을 만들 수 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, 모자, 팀, 방패, 신발]의 속성을 식별 / 당겨 수 있나요?

해결법

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

    1.네, 가능합니다.

    네, 가능합니다.

    각 스키마 (이 내 코드의 예입니다) 같은 약간 보이는 경로 속성이 있습니다 :

    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]
    }
    

    당신은 너무 모델을 통해 액세스 할 수 있습니다. 그것은 Model.schema.paths에서입니다.

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

    2.코멘트에 충분한 담당자를 가지고 있지만,이 또한 스키마 유형의 모든 통해 목록 및 루프를 밖으로 뱉어하지 마십시오.

    코멘트에 충분한 담당자를 가지고 있지만,이 또한 스키마 유형의 모든 통해 목록 및 루프를 밖으로 뱉어하지 마십시오.

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

    인쇄한다 :

    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
    

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

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

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

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

    _.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 읽기

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

    4.당신은 단지 특성을 가지고 싶다면 당신은 추가로 시작하는 '$ ___이', 당신은 객체로 문서를 설정해야하는 ORM에 의한되지 추가 방법은 다음과 같이 속성에 액세스 :

    당신은 단지 특성을 가지고 싶다면 당신은 추가로 시작하는 '$ ___이', 당신은 객체로 문서를 설정해야하는 ORM에 의한되지 추가 방법은 다음과 같이 속성에 액세스 :

    Object.keys(document.toObject());
    
  5. ==============================

    5.경우에 당신은 단지 toObject () 메소드를 사용하여 (중첩 및 인구 특성 포함)의 모든 속성 값을 갖고 싶어 :

    경우에 당신은 단지 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'
      }
      ...
    }
    
  6. ==============================

    6.그냥 당신이 얻을 싶은 필드 이름을 삽입합니다.

    그냥 당신이 얻을 싶은 필드 이름을 삽입합니다.

    let fieldName = 'birthday'
    console.log(mySchema.schema.paths[fieldName].instance);
    
  7. ==============================

    7.허용 대답은 나를 위해 작동하지 않았다. 그러나 몽구스 5.4.2 사용하여 나는 다음을 수행하여 키를 얻을 수 있었다 :

    허용 대답은 나를 위해 작동하지 않았다. 그러나 몽구스 5.4.2 사용하여 나는 다음을 수행하여 키를 얻을 수 있었다 :

    const mySchema = new Schema({ ... });
    
    const arrayOfKeys = Object.keys(mySchema.obj);
    

    나는 그러나, 타이프 라이터를 사용하고 있습니다. 그게 문제되었을 수 있습니다.

  8. ==============================

    8.내 솔루션을 사용하는 모델을 몽구스.

    내 솔루션을 사용하는 모델을 몽구스.

    스키마 속성

    const schema = {
      email: {
        type: String,
        required: 'email is required',
      },
      password: {
        type: String,
        required: 'password is required',
      },
    };
    

    개요

    const FooSchema = new Schema(schema);
    

    모델

    const FooModel = model('Foo', FooSchema);
    

    모델의 속성을 가져 오기 :

    Object.keys(FooModel.schema.tree)
    

    결과:

    [
      'email',
      'password',
      '_id',
      '__v'
    ] 
    
  9. from https://stackoverflow.com/questions/17035297/getting-schema-attributes-from-mongoose-model by cc-by-sa and MIT license