it-swarm.com.de

schemaattribute von Mongoose Model abrufen

Ich verwende Mongoose.js, um Modelle mit Schemas zu erstellen. 

Ich habe eine Liste von Modellen (viele) und manchmal möchte ich die Attribute/Schlüssel erhalten, die ein bestimmtes Modell ausmachen. 

Gibt es eine Methode zum Herausziehen der Attributschemas für ein bestimmtes Modell? 

Zum Beispiel, 

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

);

Ist es möglich, die Attribute des Schemas [SID, hats, teams, shields, shoes] herauszuziehen/zu identifizieren?

47
user1460015

Ja, es ist möglich.

Jedes Schema hat eine paths-Eigenschaft, die in etwa wie folgt aussieht (dies ist ein Beispiel für meinen 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]
}

Sie können auch über ein Modell darauf zugreifen. Es steht unter Model.schema.paths.

62
gustavohenke

Sie haben nicht genug Repräsentanten zum Kommentieren, aber dies spuckt auch eine Liste aus und durchläuft alle Schematypen.

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

sollte ausdrucken:

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

Oder Sie könnten alle Attribute als Array wie folgt erhalten:

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

Lösung für lodash, Funktion, die alle Schemaeigenschaften ausgewählt hat, jedoch nicht angegeben

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

lesen Sie hier mehr https://Gist.github.com/styopdev/95f3fed98ce3ebaedf5c

8
styopdev

Wenn Sie nur die Attribute haben möchten, die Sie hinzugefügt haben, und nicht die Add-Methoden des ORM, die mit '$ ___' beginnen, müssen Sie das Dokument in ein Objekt umwandeln und auf die Attribute wie folgt zugreifen:

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

Wenn Sie alle Eigenschaftswerte (einschließlich verschachtelter und aufgefüllter Eigenschaften) haben möchten, verwenden Sie einfach die toObject()-Methode:

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

Die Ausgabe wäre:

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

Geben Sie einfach den gewünschten Feldnamen ein.

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

Die akzeptierte Antwort hat bei mir nicht funktioniert. Aber mit Mongoose 5.4.2 konnte ich die Schlüssel folgendermaßen erhalten:

const mySchema = new Schema({ ... });

const arrayOfKeys = Object.keys(mySchema.obj);

Ich verwende jedoch TypeScript. Das könnte das Problem gewesen sein.

0
crownlessking