PHP Агрегирование MongoDB: группа поиска по _id - PullRequest
1 голос
/ 01 мая 2020

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

[
    {
        "$match": {
            "id_site": 3,
            "id_parent": null,
            "id_class": null
        }
    },
    {
        "$lookup": {
            "from": "categories",
            "localField": "_id",
            "foreignField": "id_parent",
            "as": "Childs"
        }
    },
    {
        "$unwind": {
            "path": "$Childs",
            "preserveNullAndEmptyArrays": true
        }
    }
]

После выполнения я получаю этот результат, и я не знаю, как я могу сгруппировать результаты по _id и получить категорию 1 - уровень 1 с его двумя дочерними элементами:

[
    {
        "_id": "5eac058490ba016d4942f782",
        "id_parent": null,
        "id_site": 3,
        "title": "Category 1 - Level 1",
        "Childs": {
            "_id": "5eac062590ba016d4942f783",
            "id_parent": "5eac058490ba016d4942f782",
            "id_site": 3,
            "title": "SubCategory 1 - Level 1",
            "Childs": null
        }
    },
    {
        "_id": "5eac058490ba016d4942f782",
        "id_parent": null,
        "id_site": 3,
        "title": "Category 1 - Level 1",
        "Childs": {
            "_id": "5eac324b423ea324bb762022",
            "id_parent": "5eac058490ba016d4942f782",
            "id_site": 3,
            "title": "SubCategory 2 - Level 1",
            "Childs": null
        }
    },
    {
        "_id": "5eac05d6684e587ee43af842",
        "id_parent": null,
        "id_site": 3,
        "title": "Category 2 - Level 1",
        "Childs": null
    },
    {
        "_id": "5eac05f50aa60f05b50faa92",
        "id_parent": null,
        "id_site": 3,
        "title": "Category 3 - Level 1",
        "Childs": null
    }
]

1 Ответ

0 голосов
/ 01 мая 2020

Так как вам нужно получить значения для _id и title, то есть вы должны сгруппировать по _id и title.

Здесь я добавляю дополнительные конвейеры к существующий:

[
    {
        "$match": {
            "id_site": 3,
            "id_parent": null,
            "id_class": null
        }
    },
    {
        "$lookup": {
            "from": "categories",
            "localField": "_id",
            "foreignField": "id_parent",
            "as": "Childs"
        }
    },
    {
        "$unwind": {
            "path": "$Childs",
            "preserveNullAndEmptyArrays": true
        }
    },
    {
      $group:{
        "_id":{
          "id":"$_id",
          "title":"$title"
        },
        "title":{
          $first:"$title"
        },
        "children":{
          $push:"$childs"
        }
      }
    },
    {
      $project:{
        "_id":0
      }
    }
]

Также, если вам нужны уникальные child значения, используйте $addToSet вместо $push на групповом этапе.

Для получения дополнительной информации о $group см. здесь .

Это даст вам необходимый вывод.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...