Требование API — прикрепить соответствующие данные user.details с документом Tasks, и он должен сопоставляться с родительским_user_id. Для этого я использую $lookup для сопоставления и размещения соответствующих user_details, но поскольку иногда родительский_user_id может отличаться от user_id, мне приходится использовать два поиска.< /p>
Первый $lookup присоединяет родительский_user_id для user_id в коллекции задач, а следующий $lookup прикрепляет тот подробности, используя извлеченный родительский_user_id.
Мой текущий конвейер:
Код: Выделить всё
[
{
'$lookup': {
'from': 'users',
'let': {
'uid': '$user_id',
'pid': '$project_id'
},
'pipeline': [
{
'$match': {
'$expr': {
'$and': [
{
'$eq': [
'$project_id', '$$pid'
]
}, {
'$eq': [
'$user_id', '$$uid'
]
}
]
}
}
}, {
'$project': {
'_id': 0,
'parent_user_id': 1
}
}
],
'as': 'parent_info'
}
}, {
'$replaceRoot': {
'newRoot': {
'$mergeObjects': [
{
'$arrayElemAt': [
'$parent_info', 0
]
}, '$$ROOT'
]
}
}
}, {
'$project': {
'parent_info': 0
}
}, {
'$lookup': {
'from': 'users',
'let': {
'pid': '$project_id',
'uid': '$parent_user_id'
},
'pipeline': [
{
'$match': {
'$expr': {
'$and': [
{
'$eq': [
'$project_id', '$$pid'
]
}, {
'$eq': [
'$user_id', '$$uid'
]
}
]
}
}
}, {
'$project': {
'_id': 0,
'details': 1
}
}
],
'as': 'user_info'
}
}, {
'$replaceRoot': {
'newRoot': {
'$mergeObjects': [
{
'$arrayElemAt': [
'$user_info', 0
]
}, '$$ROOT'
]
}
}
}, {
'$project': {
'user_info': 0,
'project_id': 0
}
}
Все работает нормально. Проблема в том, что в большинстве случаев родительский_user_id совпадает с user_id, поэтому я могу просто получить детали в самом первом поиске и полностью игнорировать второй поиск, но я не могу добиться это.
Любая помощь будет оценена по достоинству.
Подробнее здесь: https://stackoverflow.com/questions/758 ... -condition