Come escludere alcuni campi dal documento

Ho la seguente semplice shema:

var userSchema = new Schema({ name : String, age: Number, _creator: Schema.ObjectId }); var User = mongoose.model('User',userSchema); 

Quello che voglio fare è creare il nuovo documento e tornare al client, ma voglio escludere il campo “creatore” da uno:

 app.post('/example.json', function (req, res) { var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'}); user.save(function (err) { if (err) throw err; res.json(200, {user: user}); // how to exclude the _creator field? }); }); 

Alla fine voglio inviare il nuovo utente creato senza il campo _creator:

 { name: 'John', age: 45 } 

È ansible fare senza extra trovare la richiesta di mangusta?

PS : è preferibile farlo

Un altro modo per gestirli a livello di schema è sovrascrivere toJSON per il modello.

 UserSchema.methods.toJSON = function() { var obj = this.toObject() delete obj.passwordHash return obj } 

Mi sono imbattuto in questa domanda alla ricerca di un modo per escludere l’hash della password dal json che ho servito al client, e select: false rotto la mia funzione verifyPassword perché non ha recuperato il valore dal database.

Il modo documentato è

 UserSchema.set('toJSON', { transform: function(doc, ret, options) { delete ret.password; return ret; } }); 

AGGIORNAMENTO: potresti voler utilizzare una lista bianca:

 UserSchema.set('toJSON', { transform: function(doc, ret, options) { var retJson = { email: ret.email, registered: ret.registered, modified: ret.modified }; return retJson; } }); 

Trova la tua domanda quando stavo cercando di trovare una risposta simile con pymongo. Si scopre che nella shell di mongo, con la chiamata di funzione find (), puoi passare un secondo parametro che specifica come appare il documento risultante. Quando si passa un dizionario con il valore dell’attributo pari a 0, si esclude questo campo in tutto il documento che esce da questa query.

Nel tuo caso, ad esempio, la query sarà simile a:

 db.user.find({an_attr: a_value}, {_creator: 0}); 

Escluderà il parametro _creator per te.

In pymongo, la funzione find () è praticamente la stessa. Non sono sicuro di come si traduca in mangusta però. Penso che sia una soluzione migliore confrontare per eliminare manualmente i campi in seguito.

Spero che sia d’aiuto.

Vorrei usare le utility di lodash .pick () o .omit ()

 var _ = require('lodash'); app.post('/example.json', function (req, res) { var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'}); user.save(function (err) { if (err) throw err; // Only get name and age properties var userFiltered = _.pick(user.toObject(), ['name', 'age']); res.json(200, {user: user}); }); }); 

L’altro esempio sarebbe:

 var _ = require('lodash'); app.post('/example.json', function (req, res) { var user = new User({name: 'John', age: 45, _creator: 'some ObjectId'}); user.save(function (err) { if (err) throw err; // Remove _creator property var userFiltered = _.omit(user.toObject(), ['_creator']); res.json(200, {user: user}); }); }); 

Puoi chiamare toObject() sul documento per convertirlo in un object JS normale che puoi modificare liberamente:

 user = user.toObject(); delete user._creator; res.json(200, {user: user}); 

Seguendo la documentazione di MongoDB, puoi escludere i campi passando un secondo parametro alla tua query come:

 User.find({_id: req.user.id}, {password: 0}) .then(users => { res.status(STATUS_OK).json(users); }) .catch(error => res.status(STATUS_NOT_FOUND).json({error: error})); 

In questo caso, la password verrà esclusa dalla query.

font: https://docs.mongodb.com/v2.8/tutorial/project-fields-from-query-results/#return-all-but-the-excluded-field

Sto usando Mongoosemask e ne sono molto felice.

Supporta nascondendo ed esponendo le proprietà con altri nomi in base alle tue necessità

https://github.com/mccormicka/mongoosemask

var maskedModel = mongomask.mask (model, [‘name’, ‘age’]); // E tu hai finito.