Mongoose: 虚拟嵌套填充中断父填充选项。

创建于 2018-05-27  ·  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' }
        }
      ])
...

当在comments填充(其中嵌套了另一个填充)上包含options时,它返回超过指定的limit并且不应用sort 。 如果嵌套的填充被删除,它会按预期工作。

目前,使用:

节点 10.2.1
猫鼬 5.1.2
蒙戈 3.6.5

这是一个错误还是我错过了什么?

我相信这可能是相关的: https :

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 等级