node.js-猫鼬在没有_id字段的情况下检索数据

我想从我的Node.js应用程序中的Mongoose设置中检索一些数据。 我注意到,无论我写什么作为字段选择,我总会得到2974859255285284761600字段。 有没有一种方法不可以获取它?我现在是这样的:

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字段的结果。

Masiar asked 2020-07-20T13:52:18Z
4个解决方案
85 votes

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

Entity.find({ ... }, '-_id field1 field2', function(err, entity) {
    console.log(entity);  // { field1: '...', field2: '...' }
});
VisioN answered 2020-07-20T13:53:16Z
57 votes

必须明确排除_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);
});
danmactough answered 2020-07-20T13:52:56Z
12 votes

另一种方法:

  • 扩展模式_id,使其删除idObjectId字段
  • 在发送给客户端的所有数据库对象上调用_id
  • 额外的好处#1:您可以使用_id,因为id,而不是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;

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

Gábor Imre answered 2020-07-20T13:57:50Z
3 votes

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

async function getUserDetails(user) {
    try {
        if (!user || !user.name) return;
        const result = await Transaction.
        find({username : user.username}).
        select('uniqueId timeout confirmation_link item_name -_id'); 
        // Adding minus sign before the _id (like -_id) in the select string unselects the _id which is sent by default. 
        console.log(result);
    } catch(ex) {
        return ex
    }
}
Durja Arai answered 2020-07-20T13:58:10Z
translate from https://stackoverflow.com:/questions/9598505/mongoose-retrieving-data-without-id-field