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の問題修正されクラックするのは難しいです)。

ええ、制限と人口は非常に長い間私たちの側のとげでした。 一般的な考え方は、 populate()limit populate()を使用し、複数のドキュメントが返される場合は、ドキュメントごとに個別のクエリを実行することにフォールバックする必要があるということです。

このページは役に立ちましたか?
0 / 5 - 0 評価