Mongoose在没有_id字段的情况下检索数据

时间:2012-03-07 09:08:51

标签: node.js mongoose

我想从Node.js应用程序中的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字段的结果。

4 个答案:

答案 0 :(得分:82)

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

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

答案 1 :(得分:52)

必须明确排除

_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 :(得分:10)

另一种方法:

  • 增加删除.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;

我知道这很难看。但到目前为止,这是我最好的坏主意。

答案 3 :(得分:2)

在猫鼬的5.2.13版本(2018年9月)中,使用查询生成器方法可以将其转换为

You can use this command: \dt pg_*