2012-06-22 16 views
45

Ho il seguente semplice Shema:Come escludere alcuni campi del documento

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 cliente, ma voglio escludere il settore '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 _creator campo:

{ 
    name: 'John', 
    age: 45 
} 

È possibile effettuare senza extra una richiesta di ricerca per mangusta?

PS: E 'preferibile fare da

+0

creare un nuovo oggetto JSON senza detto campo e restituirlo. Qual è il problema? –

risposta

62

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

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

mi sono imbattuto in questa domanda cerca di un modo per escludere la password hash dal JSON ho servito al cliente, e select: false rotto la funzione VerifyPassword perché non recuperare il valore dal database a tutti.

+0

Grazie! È quello di cui ho bisogno! – Erik

+6

Provare a utilizzare UserSchema.set ('toJSON', { \t \t trasformata: la funzione (DOC, RET, opzioni) { \t \t \t eliminare ret.password; \t \t \t ritorno ret; \t \t}} \t); – Xerri

+0

Basta fare attenzione a chiunque copi questo codice, obj dovrebbe avere una dichiarazione var prima di esso, o perderà un riferimento globale. –

6

È possibile chiamare toObject() sul documento per convertirlo in un oggetto semplice JS che è possibile modificare liberamente:

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

Grazie per la risposta, posso definire un campo che non ritorna mai a livello di schema? – Erik

+4

È possibile nascondere i campi dello schema per impostazione predefinita includendo "seleziona: falso" nella definizione del campo. – JohnnyHK

+0

Questo è un modo molto migliore per farlo rispetto alla modifica della serializzazione predefinita per tutti gli oggetti. –

17

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à come:

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

Si escluderà parametro _creator per voi.

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

+0

Anche se gli altri potrebbero funzionare, questa mi sembra la risposta corretta. Ha funzionato per me – abritez

+0

Questo può funzionare in alcuni casi, ma non nella maggior parte, perché anche se non si desidera visualizzare il campo ci sono buone probabilità che si desideri che funzioni nel back-end. Il problema con questa soluzione e molti altri piace è che il campo in questione non viene mai recuperato dal database. Se hai altri campi calcolati o virtuali che dipendono da questo, non verranno impostati correttamente. – jfmatt

+2

Bypassing Mongoose sembra essere il modo consigliato di fare cose in Mongoose in questi giorni. Facciamo una domanda se Mongoose è all'altezza del compito .. – nottinhill

51

Il modo documentato è

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

AGGIORNAMENTO - Si potrebbe desiderare di 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; 
    } 
}); 
+7

o, se vostro abbia già sottolineare/lodash, è possibile utilizzare '_.pick' UserSchema.set ('toJSON', { trasformare: funzione (doc, ret, opzioni) { ritorno _.pick (in pensione, 'email', 'registrato', 'modificato') } }) –

+0

@xerri - dove è documentato? Vedo toJSON, ma avendo problemi a trovare la trasformazione –

+0

@xerri - trovato, è appena stato confuso, poiché i documenti sono sotto toObject not toJSON ==> http://mongoosejs.com/docs/api.html#document_Document-toObject –

9

vorrei utilizzare le utilità 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 è ld be:

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}); 
    }); 
}); 
1

Sto usando Mongoosemask e ne sono molto felice.

Esso supporta le proprietà di esporre con altri nomi in base alle proprie esigenze

https://github.com/mccormicka/mongoosemask

var = maskedModel mongomask.mask (modello, [ 'name', 'età']) nascondersi e; // E tu hai finito.

Problemi correlati