Подтвердить что ты не робот

Mongoose, извлекающий данные без поля _id

Я хотел бы получить некоторые данные из настройки Mongoose в моем приложении Node.js. Я заметил, что независимо от того, что я пишу в качестве выбора поля, я всегда получаю поле _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.

4b9b3361

Ответ 1

_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

Другой способ - использовать текстовый аргумент с префиксом -, который исключает из этого поля то или иное поле:

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

Ответ 3

Другой подход:

  • Дополнить .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;

Я знаю это уродливо. Но это лучшая плохая идея, что я до сих пор.