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
.
Ответы
Ответ 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;
Я знаю это уродливо. Но это лучшая плохая идея, что я до сих пор.