Mongoose: Параметры виртуального вложенного заполнения разрывов для родительского заполнения.

Созданный на 27 мая 2018  ·  3Комментарии  ·  Источник: Automattic/mongoose

Я считаю, что есть ошибка с использованием вложенных заполнений и параметров.

Мой текущий запрос выглядит следующим образом:

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

При включении options в comments populate (внутри которого вложено другое заполнение) он возвращает больше, чем указано limit а sort не применяется. Если вложенное заполнение удалено, оно работает как задумано.

В настоящее время используются:

Узел 10.2.1
Мангуст 5.1.2
Монго 3.6.5

Это ошибка или я что-то упускаю?

Я считаю, что это может быть связано: https://github.com/Automattic/mongoose/issues/4321

confirmed-bug

Самый полезный комментарий

@Mikeysax Я создал эту суть, чтобы как можно лучше воспроизвести это из вашего примера.

Его можно клонировать локально в папку с именем 6528 следующим образом:

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

Я буду путешествовать большую часть дня, но смогу разобраться в этом сегодня вечером или первым делом завтра.

Все 3 Комментарий

@Mikeysax Я создал эту суть, чтобы как можно лучше воспроизвести это из вашего примера.

Его можно клонировать локально в папку с именем 6528 следующим образом:

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

Я буду путешествовать большую часть дня, но смогу разобраться в этом сегодня вечером или первым делом завтра.

Чтобы быть ясным, мое исправление применяет объект параметров к запросу, как и ожидалось, но не устраняет проблему в # 4321. Я подумаю над этим вопросом отдельно и отправлю PR, если у меня есть идеи, которыми стоит поделиться ( это крепкий орешек ).

Да, ограничение и заселение были для нас занозой очень долгое время. Общая идея состоит в том, что нам придется вернуться к выполнению отдельных запросов для каждого документа, если вы используете populate() с limit и получаете обратно несколько документов.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги