Mongoose: Le remplissage virtuel imbriqué interrompt les options sur le remplissage parent.

Créé le 27 mai 2018  ·  3Commentaires  ·  Source: Automattic/mongoose

Je crois qu'il y a un bogue à l'aide de peuplements et d'options imbriqués.

Ma requête actuelle est la suivante :

...
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' }
        }
      ])
...

Lors de l'inclusion de options dans la population comments (qui a une autre population imbriquée à l'intérieur), elle renvoie plus que limit spécifié et sort n'est pas appliqué. Si la population imbriquée est supprimée, cela fonctionne comme prévu.

Actuellement, en utilisant :

Nœud 10.2.1
Mangouste 5.1.2
Mongo 3.6.5

Est-ce un bug ou est-ce que j'ai raté quelque chose ?

Je pense que cela pourrait être lié : https://github.com/Automattic/mongoose/issues/4321

confirmed-bug

Commentaire le plus utile

@Mikeysax J'ai créé cet aperçu pour reproduire cela du mieux que je pouvais à partir de votre exemple.

Il peut être cloné localement dans un dossier appelé 6528 ainsi :

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:

Sortir:

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>:

Je voyagerai la majeure partie de la journée, mais je pourrai m'en occuper ce soir ou demain à la première heure.

Tous les 3 commentaires

@Mikeysax J'ai créé cet aperçu pour reproduire cela du mieux que je pouvais à partir de votre exemple.

Il peut être cloné localement dans un dossier appelé 6528 ainsi :

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:

Sortir:

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>:

Je voyagerai la majeure partie de la journée, mais je pourrai m'en occuper ce soir ou demain à la première heure.

Juste pour être clair, mon correctif applique l'objet options à la requête comme prévu, mais ne résout pas le problème dans # 4321. Je vais réfléchir à cette question séparément et soumettre un PR si j'ai des idées qui méritent d'être partagées ( c'est un écrou difficile à résoudre ).

Oui, limiter et peupler est une épine dans le pied depuis très longtemps. L'idée générale est que nous devrons recourir à des requêtes distinctes pour chaque document si vous utilisez populate() avec limit et que vous récupérez plusieurs documents.

Cette page vous a été utile?
0 / 5 - 0 notes