2

我有 3 个集合:“group10”、“group20”和“parent”

我想根据“父”集合中的条件从这些集合之一的聚合管道中进行 $lookup。

集合'父':

[{_id: 1, groupId: 10},
 {_id: 2, groupId: 20}]

集合'group10':

[{_id: 1, groupId: 10, userData: 'A'},
 {_id: 2, groupId: 10, userData: 'B'}]

集合'group20':

[{_id: 1, groupId: 20, userData: 'C'},
 {_id: 2, groupId: 20, userData: 'D'}]

我尝试了下一个代码:

$lookup: {
    from: {
        $cond: [{
                $eq: ['$groupId', 10]
            },
            'group10',
            'group20'
        ]
    },
    localField: 'groupId',
    foreignField: 'groupId',
    as: 'data'
}

但收到此错误:$lookup 的“来自”选项必须是字符串,但类型为对象

4

1 回答 1

1

我进行了搜索,发现 mongo 不允许在查找中使用 from 作为动态字段,但我可以用这些解决您的问题

[
    {
        '$lookup': {
            'from': 'group10', 
            'localField': 'groupId', 
            'foreignField': 'groupId', 
            'as': 'datagroup10'
        }
    }, {
        '$lookup': {
            'from': 'group20', 
            'localField': 'groupId', 
            'foreignField': 'groupId', 
            'as': 'datagroup20'
        }
    }, {
        '$project': {
            'data': {
                '$switch': {
                    'branches': [
                        {
                            'case': {
                                '$eq': [
                                    '$datagroup20', []
                                ]
                            }, 
                            'then': '$datagroup10'
                        }
                    ], 
                    'default': '$datagroup20'
                }
            }
        }
    }
]

如果您有更多集合,您可以添加另一个查找并在 $switch 案例中添加条件或在应用程序层进行集合检测

于 2021-08-21T21:26:31.990 回答