2012-03-07 40 views
25

我想从我的Node.js应用程序中的Mongoose设置检索一些数据。我注意到无论我作为字段选择写什么,我总是得到_id字段。有没有办法取回它? 这是我该怎么做现在:Mongoose检索没有_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); 
}); 

,并记录我这包含_id场的结果。

回答

37

_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); 
}); 
+2

你可以排除_id并仍然保持ID?我注意到id是一个虚拟的字段。我想要id,但在我的REST API中排除_id。现在,当我排除_id时,id变为空 – diokey 2015-11-09 02:19:00

60

另一种方法是使用带有前缀-文本参数,将结果中不包括这个或那个领域:

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

这似乎是更优雅的语法。 – StephenT 2014-08-24 05:00:58

+1

是比第一个好多了。好一个@VisioN – luxas 2014-12-20 15:51:28

+1

更加优雅! +1 – danilodeveloper 2015-02-02 20:15:01

2

另一种方法:

  • 增广.toJSON()它删除了_id__v字段的架构
  • 致电.toJSON()发送给客户端的所有数据库对象
  • 额外利益#1:您可以使用item.id === 'something',因为typeof id === 'string'而不是ObjectId
  • 额外好处#2:当你从客户端得到gan对象并且你想搜索/更新时,你不必手动删除_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; 

我知道这是丑陋的。但迄今为止,这是最糟糕的主意。