2012-03-07 10 views
25

Vorrei recuperare alcuni dati da un'impostazione Mongoose nella mia applicazione Node.js. Ho notato che, indipendentemente da ciò che scrivo come selezione del campo, ottengo sempre il campo _id. C'è un modo per non recuperarlo? Questo è come lo faccio adesso:Mangusta che recupera dati senza campo _id

Transaction.find({username : user.username}, ['uniqueId', 'timeout', 'confirmation_link', 'item_name'], function(err, txs){ 
     console.log("user : " + user.username + " with txs: " + txs); 
     callback(txs); 
}); 

E mi registra i risultati che contengono il campo _id.

risposta

37

_id devono essere espressamente esclusi. Ad esempio,

Transaction.find({username : user.username}, { '_id': 0, 'uniqueId' :1, 'timeout': 1, 'confirmation_link': 1, 'item_name': 1}, function(err, txs){ 
    console.log("user : " + user.username + " with txs: " + txs); 
    callback(txs); 
}); 
+2

Puoi escludere _id e mantenere l'id? Ho notato che id è un campo virtuale. Voglio avere id ma escludere _id nella mia API REST. Per ora, quando escludo _id, id diventa nullo – diokey

60

Un altro modo è quello di usare argomento testo con il prefisso - che escluderà questo o quel campo dal risultato:

Entity.find({ ... }, '-_id field1 field2', function(err, entity) { 
    console.log(entity); // { field1: '...', field2: '...' } 
}); 
+1

Questa sembra la sintassi più elegante. – StephenT

+1

Sì, molto meglio del primo. Buono @VisioN – luxas

+1

Molto più elegante! +1 – danilodeveloper

2

altro approccio:

  • aumentare il .toJSON() dello schema che elimina i campi e __v
  • Chiamata .toJSON() su tutti gli oggetti DB inviati al client
  • Beneficio aggiuntivo n. 1: è possibile utilizzare item.id === 'something' perché typeof id === 'string', non ObjectId.
  • Beneficio aggiuntivo n. 2: quando si recupera l'oggetto dal client e si desidera eseguire la ricerca/l'aggiornamento, non è necessario eliminare manualmente _id perché non ce n'è uno, solo uno id che viene ignorato.

Augmenting JSON:

mySchema.set('toJSON', { 
    virtuals: true, 
    transform: (doc, ret, options) => { 
     delete ret.__v; 
     ret.id = ret._id.toString(); 
     delete ret._id; 
    }, 
}); 

modo da poter utilizzare:

let item = (await MyCollection.findOne({/* search */}).exec()).toJSON(); 
if (item.id === 'someString') return item; 

so che è brutto. Ma è la migliore cattiva idea che ho finora.