MongoDB Aggregation



  • Привет,

    Вопрос по агригациям в Монго:
    Есть две коллекции: 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

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

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

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

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

    Яаков.



  • Вот 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" нужно добавить индекс в обоих коллекциях.


Авторизуйтесь, чтобы ответить