Навигация

    Shopker - Форум

    • Зарегистрироваться
    • Войти
    • Поиск
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Вернуться на сайт

    MongoDB Aggregation

    Вопросы и обсуждения
    2
    2
    66
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • Y
      YaakovU отредактировано Admin

      Привет,

      Вопрос по агригациям в Монго:
      Есть две коллекции: settings и runtime

      В settings след. структура:

      {
      	"*projectNickName*": "**Proj_А**",
      	"*flowVersion*": "**1**",
      	"stages": [{
      			"*stageNickName*": "**AA**",
      			"reference": [{
      					"stageNickName": "АA1",
      					"operator": "**TBT**"
      				},
      				{
      					"stageNickName": "АA2",
      					"operator": ""
      				},
      				{
      					"stageNickName": "АA3",
      					"operator": ""
      				}
      			]
      		},
      		{
      			"stageNickName": "AB",
      			"reference": [{
      					"stageNickName": "АB1",
      					"operator": ""
      				},
      				{
      					"stageNickName": "АB2",
      					"operator": ""
      				},
      				{
      					"stageNickName": "АB3",
      					"operator": ""
      				}
      			]
      		}
      	]
      }
      

      В runtime след. структура:

      {
      "flowInstanceID": "662314cb-4a5d-49d5-986e-7ee84aba8ac4",
      "*projectNickName*": "**Proj_A**",
      "*flowVersion*": **1**,
      "*flowInstanceStatus*": "**STARTED**",
      "runTime": [
         {"stageNickName": "AA","stageInstanceStatus":"WAITING" },
         {"stageNickName": "AB","stageInstanceStatus":"COMPLETED" }
       ]
      }
      

      Мне нужно сделать inner join (SQL) между по двум полям: projectNickName и flowVersion, и отобрать те runtime с flowInstanceStatus=STARTED, в которых есть runTime такой stageNickName у которого в settings в массиве reference есть хотя бы один oerator=TBT

      Нужно ли более подробно описать или и так понятно?

      В принципе, можно это решить без агригаций через код, но так намного производительние.

      Можно ли это сделать с помощью агригации?

      Заранее спасибо!

      Яаков.

      1 ответ Последний ответ Ответить Цитировать 0
      • Admin
        Admin отредактировано Admin

        Вот Join по двум полям:

        db.runtime.aggregate([{$lookup: {
            from: "settings",
            let: { pNickName: "$projectNickName", fVersion: "$flowVersion" },
            pipeline: [
              { $match:
                 { $expr:
                    { $and:
                       [
                         { $eq: [ "$projectNickName",  "$$pNickName" ] },
                         { $eq: [ "$flowVersion", "$$fVersion" ] }
                       ]
                    }
                 }
              }
            ],
            as: 'settings'
        }}])
        

        Дальше остается только фильтровать, думаю это не сложно.

        Если данных много, то для полей "projectNickName" и "flowVersion" нужно добавить индекс в обоих коллекциях.

        1 ответ Последний ответ Ответить Цитировать 0
        • 1 / 1
        • First post
          Last post
        2020 • Shopker