Mongoose/Mongodb: исключить поля из заполненных данных запроса
Я использую следующий запрос мангуста в среде MEAN для поиска и вывода конкретного автора и его соответствующих книг.
Author
.findOne({personcode: code})
.select('-_id')
.select('-__v')
.populate('bookids') //referencing to book documents in another collection (->array of bookids)
.select('-_id') //this doens't affect the data coming from the bookids-documents
.select('-__v') //this doens't affect the data coming from the bookids-documents
.exec(function (err, data) {
//foo
});
Я также хотел бы исключить поля "_id" и "__v" из заполненных данных, поступающих из внешних документов. Как это можно достичь?
Ответы
Ответ 1
Второй параметр populate
- это строка выбора поля, поэтому вы можете сделать это как:
Author
.findOne({personcode: code})
.select('-_id -__v')
.populate('bookids', '-_id -__v')
.exec(function (err, data) {
//foo
});
Обратите внимание, что вы должны комбинировать выбранные поля в одну строку.
Ответ 2
Спасибо JohnnyHK, а для параметра объекта это работает:
Entity.populate({
path: 'bookids',
// some other properties
match: {
active: true
},
// some other properties
select: '-_id -__v' // <-- this is the way
}).then(...) // etc
Ответ 3
Я пришел в поисках чего-то немного другого. на всякий случай кому-то нужно так же, как и мне.
Вы можете указать конкретные поля для автоматического заполнения при создании схемы, как показано ниже
const randomSchema = mongoose.Schema({
name: {type: String,trim: true},
username: {type: String,trim: true},
enemies: {
type: ObjectId,
ref: randomMongooseModel,
autopopulate:{
select: '-password -randonSensitiveField' // remove listed fields from selection
}
},
friends: {
type: ObjectId,
ref: randomMongooseModel,
autopopulate:{
select: '_id name email username' // select only listed fields
}
}
});
Я использую плагин mongoose-autopopulate для этого примера.