MongoDB вложенный $ lookup с 3 уровнями, let и pipe - PullRequest
0 голосов
/ 19 марта 2020

Я хочу этот результат, вложенный с 3 дочерними уровнями. Board -> Columns -> Cards.

{
    "id": "5e717d6d6e7cbf226074c3fe",
    "name": null,
    "createdBy": "admin",
    "createdDate": 1584495981290,
    "updatedBy": "admin",
    "updatedDate": 1584495981290,
    "columns": [
        {
            "id": "5e72bfa6cc3ff9000ae93c92",
            "name": null,
            "createdBy": "admin",
            "createdDate": 1584578470269,
            "updatedBy": "admin",
            "updatedDate": 1584578470269,
            "idBoard": "5e717d6d6e7cbf226074c3fe",
            "cards": [
                {
                    "id": "5e72de720715f131878b4ed2",
                    "name": "esse é o card",
                    "createdBy": "admin",
                    "createdDate": 1584586354958,
                    "updatedBy": "admin",
                    "updatedDate": 1584586354958,
                    "idColumn": "5e72bfa6cc3ff9000ae93c92"
                }
            ]
        },
        {
            "id": "5e72bfefcc3ff9000ae93c95",
            "name": "coluna criada com sucesso.",
            "createdBy": "admin",
            "createdDate": 1584578543201,
            "updatedBy": "admin",
            "updatedDate": 1584578543201,
            "idBoard": "5e717d6d6e7cbf226074c3fe",
            "cards": [
                {
                    "id": "5e72de550715f131878b4ed0",
                    "name": "esse é o card",
                    "createdBy": "admin",
                    "createdDate": 1584586325485,
                    "updatedBy": "admin",
                    "updatedDate": 1584586325485,
                    "idColumn": "5e72bfefcc3ff9000ae93c95"
                },
                {
                    "id": "5e72de630715f131878b4ed1",
                    "name": "esse é o card2",
                    "createdBy": "admin",
                    "createdDate": 1584586339140,
                    "updatedBy": "admin",
                    "updatedDate": 1584586339140,
                    "idColumn": "5e72bfefcc3ff9000ae93c95"
                }
            ]
        }
    ]
}

Но карты повторяют 14 раз одинаковое значение в 2 столбцах выше, я не знаю почему.

Проблема с картами, получить доску , получите две колонки, но я не хочу повторять карточки.

Как решить эту проблему, избегайте повторения карточки для многих карточек, просто возьмите карточку с idColumn.

Агрегация запись с Пн go 4.2.

db.boards.aggregate([
    {"$match": {"_id":ObjectId("5e717d6d6e7cbf226074c3fe")}} ,
    {"$lookup": {
        "from":"columns",
        "let":{"id":"$id"},
        "pipeline": [
            {"$match":{"$expr": {"$eq": ["$IdBoard","$$id"]}}},
            {"$lookup":{
                "from":"cards",
                "let":{"idx":"$cards._id"},
                "pipeline":[
                    {"$match":{"$expr": {"$eq": ["$IdColumn","$$idx"]}}},
                ],
                "as":"cards"
            }}
        ],
        "as":"columns"
    }} ,{
        "$unwind":"$columns"
    }
]).pretty();

Обновление: образцы доски, колун, карт.

Доска

{"id": "5e717d6d6e7cbf226074c3fe","name": null, "createdBy": "admin","createdDate": 1584495981290, "updatedBy": "admin","updatedDate": 1584495981290}

Две колонки с idBoard 5e717d6d6e7cbf226074c3fe

{"id": "5e72bfa6cc3ff9000ae93c92","name": null,"createdBy": "admin","createdDate": 1584578470269,"updatedBy": "admin","updatedDate": 1584578470269,"idBoard": "5e717d6d6e7cbf226074c3fe"
{"id": "5e72bfefcc3ff9000ae93c95","name": "coluna criada com sucesso.","createdBy": "admin","createdDate": 1584578543201,"updatedBy": "admin","updatedDate": 1584578543201,"idBoard": "5e717d6d6e7cbf226074c3fe"}

Карта с idColumn 5e72bfa6cc3ff9000ae93c92

Две карты с idColumn 5e72bfefcc3ff9000ae93c95

{"id": "5e72de550715f131878b4ed0","name": "esse é o card","createdBy": "admin","createdDate": 1584586325485,"updatedBy": "admin","updatedDate": 1584586325485,"idColumn": "5e72bfefcc3ff9000ae93c95"},
{"id": "5e72de630715f131878b4ed1","name": "esse é o card","createdBy": "admin","createdDate": 1584586339140,"updatedBy": "admin","updatedDate": 1584586339140,"idColumn": "5e72bfefcc3ff9000ae93c95"}

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Я использую Пн go 4.2.3. Этот запрос работает очень хорошо.

db.boards.aggregate([
    {
        "$match": {
            "_id":ObjectId("5e717d6d6e7cbf226074c3fe")
        }
    },
    {
        "$lookup": {
            "from": "columns",
            "let": {
                "idBoard": "$_id"
            },
            "pipeline": [
                {
                    "$match": {
                        "$expr": {
                            "$eq": [
                                "$idBoard",
                                "$$idBoard"
                            ]
                        }
                    }
                },
                {
                    "$lookup": {
                        "from": "cards",
                        "let": {
                            "idColumn": "$_id"
                        },
                        "pipeline": [
                            {
                                "$match": {
                                    "$expr": {
                                        "$eq": [
                                            "$idColumn",
                                            "$$idColumn"
                                        ]
                                    }
                                }
                            },
                        ],
                        "as": "cards"
                    }
                }
            ],
            "as": "columns"
        }
    }
]).pretty();
0 голосов
/ 20 марта 2020

Вы справились, но имена переменных, которые вы настроили для запроса, имеют опечатку.

Я предполагаю:

  1. id - это поле, а не _id field
  2. Вы не равны разным типам, как ObjectId = String
  3. Вам не нужно $unwind

Попробуйте это:

db.boards.aggregate([
  {
    "$match": {
      "id": "5e717d6d6e7cbf226074c3fe"
    }
  },
  {
    "$lookup": {
      "from": "columns",
      "let": {
        "id": "$id"
      },
      "pipeline": [
        {
          "$match": {
            "$expr": {
              "$eq": [
                "$idBoard",
                "$$id"
              ]
            }
          }
        },
        {
          "$lookup": {
            "from": "cards",
            "let": {
              "idx": "$id"
            },
            "pipeline": [
              {
                "$match": {
                  "$expr": {
                    "$eq": [
                      "$idColumn",
                      "$$idx"
                    ]
                  }
                }
              },

            ],
            "as": "cards"
          }
        }
      ],
      "as": "columns"
    }
  }
])

MongoPlayground

...