2012-03-07 18 views
25

Me gustaría recuperar algunos datos de una configuración Mongoose en mi aplicación Node.js. Noté que no importa lo que escriba como selección de campo, siempre obtengo el campo _id. ¿Hay alguna manera de no buscarlo? Esto es como lo hago ahora:Mongoose recuperando datos sin _id campo

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

Y me registra los resultados que contienen el campo _id.

Respuesta

37

_id se deben excluir específicamente. Por ejemplo,

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

¿Se puede excluir _id y aún así conservar la identificación? Noté que id es un campo virtual. Quiero tener una identificación pero excluir _id en mi API REST. Por ahora, cuando excluyo _id, id se vuelve nulo – diokey

60

Otra forma es utilizar el argumento de texto con el prefijo - que excluirá tal o cual campo del resultado:

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

Parece ser la sintaxis más elegante. – StephenT

+1

Sí, mucho mejor que el primero. Buena @VisioN – luxas

+1

¡Mucho más elegante! +1 – danilodeveloper

2

Otro enfoque:

  • aumentar el .toJSON() del esquema que borra los campos _id y __v
  • Llame al .toJSON() en todos los objetos DB enviados al cliente
  • Beneficio adicional # 1: puede usar item.id === 'something' porque typeof id === 'string', no ObjectId.
  • Beneficio adicional # 2: cuando recuperaste el objeto gan del cliente y deseas buscar/actualizar, entonces no tienes que eliminar manualmente _id porque no hay ninguno, solo un id que se ignora.

Augmenting JSON:

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

lo que puede utilizar:

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

sé que es feo. Pero es la mejor mala idea que tengo hasta ahora.

Cuestiones relacionadas