mongodb - Mongoose Populate - Retornar dados especificos - Stack Overflow em Português
Estou usando o populate para retornar dados do usuario que criou uma postagem. Funciona bem, o problema é que o populate retorna o usuario inteiro, incluindo hash de senha e outras informações, mas eu só preciso do nome e imagem, então crio um novo objeto apenas com essas duas informações, coloco na postagem e dou como resposta da API o novo dado formatado.
Eu sei que tem uma forma mais direta de fazer isso, mas não lembro, que é usar o populate ou outro metodo para retorna apenas os dados especificos da minha referencia. Qual as chaves que uso?
Model/Schema da postagem:
const modelSchema = new mongoose.Schema({
author: { type: mongoose.ObjectId, ref: 'users', required: true },
title: { type: String, required: true, min: 3, max: 100 },
creationDate: { type: Date, required: true },
slug: { type: String, required: true, min: 3, max: 150 },
Buscando a postagem junto com os dados do seu criador:
const post = await posts.findOne({ slug: req.params.slug }).populate('author')
A saida dessa forma fica parecido com:
title: 'novo post',
body: 'apenas um teste',
creationDate: '2021-05-31',
slug: 'novo-post',
email: 'teste@gmail.com',
image: 'asdf',
hash: 'aaaaaaaaaaaaaaaaaaaaaaaaa',
Depois eu pego só as informações que preciso, mas gostaria de receber diretamente do mongoose os dados especificos do author.
Você pode usar o método populate com select:
const post = await posts.findOne({ slug: req.params.slug }).populate({path: 'author', select: 'name email image'})
respondida 14/10/2021 às 18:52
Sinuhe Djin Maschio ShinSinuhe Djin Maschio Shin
Existe diferentes formas para solucionar este tipo de problema, uma delas é a respoatas dada acima pelo Sinuhe Djin Maschio Shin. Utlizando path e o select deste modo poderá obter do author apenas os campos que deseja:
const post = await posts.findOne({ slug: req.params.slug }).populate({ path: 'author', select: 'email' })
Podemos melhorar o código aplicando desestruturação:
const post = await posts.findOne({ slug }).populate({ path: 'author', select: 'email' })
Para mais informações sobre a utilização do populate basta acessa o link https://mongoosejs.com/docs/populate.html
Também podes manter o método que está usando: const post = await posts.findOne({ slug: req.params.slug }).populate('author'), para acessar os campos desejados basta escrever post.author.email para retornar o email ou qualquer outro campo do author que desejar obter.
respondida 26/02 às 11:45
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag mongodb mongoose ou faça sua própria pergunta.