web-dev-qa-db-fra.com

obtention des attributs de schéma du modèle Mongoose

J'utilise Mongoose.js pour créer des modèles avec des schémas. 

J'ai une liste de modèles (plusieurs) et parfois j'aimerais obtenir les attributs/clés qui constituent un modèle particulier. 

Existe-t-il une méthode permettant d'extraire les schémas d'attributs pour un modèle donné? 

Par exemple, 

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

)

Est-il possible d'extraire/d'identifier les attributs du schéma [SID, hats, teams, shields, shoes] ??

47
user1460015

Oui c'est possible.

Chaque schéma a une propriété paths, qui ressemble à ceci (voici un exemple de mon code):

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

Vous pouvez également y accéder via un modèle. C'est sous Model.schema.paths.

62
gustavohenke

Vous n'avez pas assez de représentants pour commenter, mais cela crée également une liste et parcourt tous les types de schéma.

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

devrait imprimer:

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

Ou vous pouvez obtenir tous les attributs sous forme de tableau comme ceci:

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

Solution pour lodash, fonction qui a sélectionné toutes les propriétés du schéma, à l’exception

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

en lire plus ici https://Gist.github.com/styopdev/95f3fed98ce3ebaedf5c

8
styopdev

Si vous voulez avoir uniquement les attributs que vous avez ajoutés et non les méthodes d'ajout par l'ORM qui commence par '$ ___', vous devez transformer le document en objet, puis accéder aux attributs comme ceci:

Object.keys(document.toObject());
2
e-nouri

Si vous souhaitez avoir toutes les valeurs de propriété (y compris les propriétés imbriquées et renseignées), utilisez simplement la méthode toObject():

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

La sortie serait:

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

Il suffit d'insérer le nom du champ que vous souhaitez obtenir.

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