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 для этого примера.