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