Estoy usando Mongoose.js para crear los modelos con esquemas.

Tengo una lista de modelos de los (muchos) y a veces me gustaría tener los atributos y claves que hacen que un modelo en particular.

Hay un método para sacar el atributo de esquemas para cualquier modelo?

Por ejemplo,

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

);

Es posible sacar/identificar los atributos del esquema de [SID, hats, teams, shields, shoes]??

InformationsquelleAutor user1460015 | 2013-06-11

7 Comentarios

  1. 66

    Sí, es posible.

    Cada esquema tiene un paths de la propiedad, que se ve algo como esto (esto es un ejemplo de mi código):

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

    Puede acceder a este a través de un modelo demasiado. Es bajo Model.schema.paths.

    • podría proporcionar un recurso?
    • Yo no entendía. ¿Quieres enlaces?
    • seguro… simplemente es algo que yo pueda hacer referencia en el futuro, en lugar de preguntar aquí.
    • mongoosejs.com/docs/api.html#schema_Schema-paths
    • Es allí una manera de conseguir esto a partir de un objeto de base de datos si usted no sabe el esquema?
    • Tal vez intente iterar a través de los modelos registradas con modelNames(), luego de recuperar los modelos y sus rutas de acceso de la misma manera.
    • Para agregar a la respuesta , si usted ha creado un Esquema denominado Temp, a continuación, usted puede tener acceso al objeto de utilizar Temp.rutas

  2. 37

    No tienen suficiente rep para comentar, pero esto también escupe una lista y un bucle a través de todos los tipos de esquemas.

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

    debe imprimir:

    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

    O usted puede obtener todos los Atributos como una Matriz como esta:

    var props = Object.keys(mySchema.schema.paths);
    • esto no es bueno porque va a dar a todos el atributo del objeto, incluyendo los métodos!
    • Que no es el comportamiento que yo estoy haciendo (al menos en la v4). Métodos y estática no están incluidos en el schema.eachPath( ) resultados
  3. 9

    Solución para lodash, función que recogió todas las propiedades del esquema, excluyendo especificado

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

    leer más aquí https://gist.github.com/styopdev/95f3fed98ce3ebaedf5c

  4. 2

    Si quieres tener sólo los atributos que agregan y no agregan métodos por el ORM, que comienza con ‘$___’, tiene a su vez el documento en el objeto, a continuación, tener acceso a los atributos como este:

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

    En caso de que quieras tener todos los valores de propiedad (incluyendo anidados y poblada propiedades), sólo tiene que utilizar toObject() método:

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

    La salida sería:

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

    Sólo tiene que insertar el nombre del campo que desea obtener.

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

    Aceptado la respuesta no me funciona.
    Pero el uso de la Mangosta 5.4.2 yo era capaz de conseguir las llaves de la siguiente forma:

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

    Estoy usando manuscrito, sin embargo. Podría haber sido el problema.

Dejar respuesta

Please enter your comment!
Please enter your name here