mongoose检索没有_id字段的数据

我想从我的Node.js应用程序中的Mongoose设置中检索一些数据。 我注意到,无论我作为字段select写什么,我总是得到_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); }); 

并logging包含_id字段的结果。

_id必须明确排除。 例如,

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

另一种方法是使用带前缀的文本参数-这将从结果中排除这个或那个字段:

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

另一种方法:

  • .toJSON()删除_id__v字段的模式的.toJSON()
  • 调用发送给客户端的所有数据库对象的.toJSON()
  • 额外的好处#1:你可以使用item.id === 'something'因为typeof id === 'string' ,而不是ObjectId
  • 额外的好处#2:当你从客户端得到gan对象并且你想search/更新时,你不必手动删除_id因为没有,只是一个被忽略的id

增加JSON:

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

所以你可以使用:

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

我知道这很丑。 但是到目前为止,这是最糟糕的主意。