Mam tę operację agregacji i daje mi prawidłowe wyjście, ale z niespójnym porządkiem. Po ponownym załadowaniu, zagnieżdżona tablica wyjściowa (Posteriorthread) zmienia kolejność dokumentów, a wydaje się, że nie ma rymu ani powodu!

Jestem zdezorientowany, dlaczego zamówienie zmienia się, a ja chciałbym wiedzieć, dlaczego się dzieje, ale pomyślałem, że będę go uporczył, co zrobiłem, ale mam problemy z grupami z powrotem.

Pokażę ci oba moje złamane rozwiązania poniżej, ale zasadniczo chcę wyjść 1, ale z prawidłową kolejnością. Używam mangusta, ale nie powinno to robić różnicy.

Dzięki.

1: niespójne rozwiązanie zamówienia

const posteriorThread = await Comment.aggregate([
      {
        $match: {
          _id: post.threadDescendant,
        },
      },
      {
        $graphLookup: {
          from: 'comments',
          startWith:'$threadDescendant',
          connectFromField: 'threadDescendant',
          connectToField: '_id',
          as: 'posteriorThread',
        },
      },
    ]);

WYJŚCIE: 1


posteriorThread [
  {
    "_id": "000",
    "name": "foo bar",
    "text": "testing one",
    "threadDescendant": "123",
    "posteriorThread": [
      {
        "_id": "234",
        "name": "foo bar",
        "text": "testing four",
        "threadDescendant": "345"
      },
      {
        "_id": "345",
        "name": "foo bar",
        "text": "testing three",
      }, 
      {
        "_id": "123",
        "name": "foo bar",
        "text": "testing two",
        "threadDescendant": "234"
      },  
    ]
  }
]

2: Popraw starszy, ale utracie dokument root

    const posteriorThread = await Comment.aggregate([
      {
        $match: {
          _id: post.threadDescendant,
        },
      },
      {
        $graphLookup: {
          from: 'comments',
          startWith: '$threadDescendant',
          connectFromField: 'threadDescendant',
          connectToField: '_id',
          as: 'posteriorThread',
        },
      },
      {
        $unwind: '$posteriorThread',
      },
      {
        $sort: { 'posteriorThread.depth': 1 },
      },
      {
        $group: { _id: '$_id', posteriorThread: { $push: '$posteriorThread' } },
      },
    ]);

WYJŚCIE 2:

posteriorThread [
  {
    "_id": "000",
    "posteriorThread": [
      {
        "_id": "123",
        "name": "foo bar",
        "text": "testing two",
        "threadDescendant": "234"
      },  
      {
        "_id": "234",
        "name": "foo bar",
        "text": "testing four",
        "threadDescendant": "345"
      },
      {
        "_id": "345",
        "name": "foo bar",
        "text": "testing three",
      }, 
    ]
  }
]
1
ram 29 lipiec 2020, 12:04

1 odpowiedź

Najlepsza odpowiedź

Etap rurociągu $graphLookup nie oferuje wbudowanej możliwości sortowania, więc drugie podejście jest poprawne. Wystarczy użyć $ najpierw w celu zachowania obiektu głównego pola. Możesz użyć $ Wymiana i specjalna $$ROOT zmienna Aby uniknąć wyraźnego określenia każdego pola:

{
    $group: {
        _id: "$_id",
        posteriorThread: { $push: "$posteriorThread" },
        root: { $first: "$$ROOT" }
    }
},
{
    $project: {
        "root.posteriorThread": 0
    }
},
{
    $replaceRoot: {
        newRoot: {
            $mergeObjects: [
                { posteriorThread: "$posteriorThread" },
                "$root"
            ]
        }
    }
}

Plac zabaw Mongo

1
mickl 29 lipiec 2020, 10:22