Mongoose: Virtuell verschachtelte Auffüllungsunterbrechungsoptionen für die übergeordnete Auffüllung.

Erstellt am 27. Mai 2018  ·  3Kommentare  ·  Quelle: Automattic/mongoose

Ich glaube, dass es einen Fehler gibt, der verschachtelte Populationen und Optionen verwendet.

Meine aktuelle Anfrage lautet wie folgt:

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

Wenn options in die comments (die eine weitere Auffüllung enthält), gibt es mehr als die angegebenen limit und sort wird nicht angewendet. Wenn die verschachtelte Auffüllung entfernt wird, funktioniert sie wie vorgesehen.

Derzeit mit:

Knoten 10.2.1
Mungo 5.1.2
Mongo 3.6.5

Ist das ein Bug oder übersehe ich etwas?

Ich glaube, das könnte zusammenhängen: https://github.com/Automattic/mongoose/issues/4321

confirmed-bug

Hilfreichster Kommentar

@Mikeysax Ich habe diesen Kern erstellt, um dies so gut wie möglich aus Ihrem Beispiel zu replizieren.

Es kann also lokal in einen Ordner namens 6528 geklont werden:

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:

Ausgabe:

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

Ich werde den größten Teil des Tages auf Reisen sein, kann mir das aber heute Abend oder morgen als erstes ansehen.

Alle 3 Kommentare

@Mikeysax Ich habe diesen Kern erstellt, um dies so gut wie möglich aus Ihrem Beispiel zu replizieren.

Es kann also lokal in einen Ordner namens 6528 geklont werden:

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:

Ausgabe:

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

Ich werde den größten Teil des Tages auf Reisen sein, kann mir das aber heute Abend oder morgen als erstes ansehen.

Nur um es klarzustellen, mein Fix wendet das Optionsobjekt wie erwartet auf die Abfrage an, behebt jedoch nicht das Problem in #4321. Ich werde über dieses Thema separat nachdenken und eine PR einreichen, wenn ich irgendwelche Ideen habe, die es wert sind, geteilt zu werden ( es ist eine harte Nuss zu knacken ).

Yeah limit and populate ist uns schon sehr lange ein Dorn im Auge. Die allgemeine Idee ist, dass wir auf separate Abfragen für jedes Dokument zurückgreifen müssen, wenn Sie populate() mit limit und Sie mehrere Dokumente zurückerhalten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen