【问题标题】:How can I do $lookup from different collections depending on some condition?如何根据某些条件从不同的集合中进行 $lookup?
【发布时间】:2019-10-05 05:28:18
【问题描述】:

我有 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 的 'from' 选项必须是字符串,但类型为对象

【问题讨论】:

标签: mongodb aggregation-framework mongodb-stitch


【解决方案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 案例中添加条件或在应用层进行集合检测

【讨论】:

  • 任何代码示例?也请edit 并格式化您的答案以提高可读性。
猜你喜欢
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 2021-11-28
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多