Acredito que haja um bug no uso de populates e opções aninhados.
Minha consulta atual é a seguinte:
...
await Post.find(
{ teacher: req.params.id },
{},
{
sort: { createdAt: -1 },
limit: 5,
skip: parseInt(req.query.skip, 10)
}
).populate([
{
path: 'comments',
options: {
limit: 5,
sort: { createdAt: -1 }
},
populate: { path: 'user', select: '-password' }
}
])
...
Ao incluir options
no preenchimento comments
(que tem outro preenchimento aninhado), ele retorna mais do que limit
especificado e sort
não é aplicado. Se o preenchimento aninhado for removido, ele funcionará conforme o esperado.
Atualmente, usando:
Nó 10.2.1
Mongoose 5.1.2
Mongo 3.6.5
Isso é um bug ou estou faltando alguma coisa?
Acredito que isso possa estar relacionado: https://github.com/Automattic/mongoose/issues/4321
@Mikeysax Eu criei esta essência para replicar isso da melhor forma que pude com o seu exemplo.
Ele pode ser clonado localmente em uma pasta chamada 6528 da seguinte forma:
issues: git clone https://gist.github.com/7dee38490d8c637976d8fb0805aafb1e ./6528
Cloning into './6528'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
issues: ls !$
ls ./6528
6528.js models6528.js populate6528.js
issues:
6528>: chmod +x populate6528.js
6528>: chmod +x 6528.js
6528>: ./populate6528.js
created 10 users
created 10 teachers
created 100 posts
created 1000 comments
6528>: ./6528.js
{ AssertionError [ERR_ASSERTION]: 10 === 5
at run (/Users/lineus/dev/Help/mongoose5/issues/6528/6528.js:38:10)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
generatedMessage: true,
name: 'AssertionError [ERR_ASSERTION]',
code: 'ERR_ASSERTION',
actual: 10,
expected: 5,
operator: '===' }
^C
6528>:
Estarei viajando a maior parte do dia, mas poderei dar uma olhada nisso hoje à noite ou amanhã bem cedo.
Só para ficar claro, minha correção aplica o objeto de opções à consulta conforme o esperado, mas não corrige o problema em # 4321. Vou pensar um pouco nesse assunto separadamente e enviar um PR se tiver alguma ideia que valha a pena compartilhar ( é um osso duro de roer ).
Sim, limitar e povoar tem sido um espinho em nosso lado por muito tempo. A ideia geral é que teremos que voltar a fazer consultas separadas para cada documento se você usar populate()
com limit
e receber vários documentos de volta.
Comentários muito úteis
@Mikeysax Eu criei esta essência para replicar isso da melhor forma que pude com o seu exemplo.
Ele pode ser clonado localmente em uma pasta chamada 6528 da seguinte forma:
Saída:
Estarei viajando a maior parte do dia, mas poderei dar uma olhada nisso hoje à noite ou amanhã bem cedo.