Исходя из этого вопроса, я надеюсь отфильтровать список родительских документов на основе значений в связанных дочерних документах.
Учитывая следующие коллекции mongoDB ....
// 'job' collection
{
"id" : j1,
"mediaID" : "ABC1234"
},
{
"id" : j2,
"mediaID" : "DEF1234"
}
.. и ..
// 'task' collection
// j1 tasks
{
"id" : "t1",
"job" : "j1",
"taskName": "MOVE",
"status" : "COMPLETE"
},
{
"id" : "t2",
"job" : "j1",
"taskName": "PUBLISH",
"status" : "FAILED"
},
// j2 tasks
{
"id" : "t3",
"job" : "j2",
"taskName": "MOVE",
"status" : "COMPLETE"
},
{
"id" : "t4",
"job" : "j2",
"taskName": "PUBLISH",
"status" : "COMPLETE"
}
.. где коллекция задач связана с коллекцией заданий через job.id -> task.job
У меня есть сводный запрос, который отфильтрует коллекцию job
по критериям в дочерней коллекции. Я использую конвейерный синтаксис Mongo's $lookup
и у меня есть запрос примерно такой ...
db.getCollection("job").aggregate(
[
{
"$lookup": {
"from" : "task",
"let" : {
"job_id": "$_id"
},
"pipeline": [
{
"$match": {
"$expr": {
"$and": [
{
// link job.id to task.job
"$eq": ["$job", "$$job_id"]
},
{
// Filter taskName
"$eq": ["$taskName", "PUBLISH"]
},
{
// Filter by status
"$eq": ["$status", "FAILED"]
}
]
}
}
}
],
"as" : "tasks"
}
},
{
// Remove ROOT docs that do not meet 'task' criteria
"$match": {
"tasks": {"$ne": []}
}
}
]
);
Это работает просто отлично, за исключением того, что мне бы хотелось, чтобы все поддокументы родителя возвращались в результатах, а не только тот, который соответствовал.
Например, приведенный выше запрос дает мне это ...
{
"id" : j1,
"mediaID" : "ABC1234"
"tasks" : [
{
"id" : "t2",
"job" : "j1",
"taskName": "PUBLISH",
"status" : "FAILED"
},
]
},
.. но я бы хотел это ...
{
"id" : j1,
"mediaID" : "ABC1234"
"tasks" : [
{
"id" : "t1",
"job" : "j1",
"taskName": "MOVE",
"status" : "COMPLETE"
},
{
"id" : "t2",
"job" : "j1",
"taskName": "PUBLISH",
"status" : "FAILED"
},
]
},
У меня есть чернила, которые мне нужно было бы использовать $push
в какой-то момент, но я в тупике! Любая помощь приветствуется.