在查询中映射嵌套的集合

时间:2020-03-04 14:49:05

标签: mongodb aggregation-framework

我有两个集合:项目和委员会。

// collection items
{
    _id: ObjectId("5d2b9e2da676e50cb9d061fe"),
    name: 'some name'
}

// collection commisions
{ 
    _id: ObjectId("5d2cb8ad7240251917b18c03"),
    items: [
        {
          item: ObjectId("5d2b9e2da676e50cb9d061fe")
        }
    ]
}

现在使用聚合,我需要查找带有计数的项目(它们出现在多少个委员会中)。我正在尝试:

db.getCollection('items').aggregate([{
        $match: {
            _id: ObjectId("5d2b9e2da676e50cb9d061fe")
        }
    }, {
        $lookup: {
            from: 'commisions',
            let: {
                item: '$_id',
                items: {
                    $map: {
                        input: '$items',
                        as: 'i',
                        in: '$$i.item',
                    }
                }
            },
            pipeline: [{
                $match: {
                    $expr: {
                        $in: ['$item', '$items']
                    }
                }
            }],
            as: 'commisions'
        }
    },
    {
        $project: {
            commisions: 1,
            commisionsSize: { $size: '$commisions' }
    }
},
{
    $limit: 100
}
]) 

但是当我尝试运行此查询时,我得到了:

“ errmsg”:“ $ in需要一个数组作为第二个参数,发现:丢失”

问题是commision.items不是平面数组,而是嵌套的。

1 个答案:

答案 0 :(得分:1)

我认为您对$lookup语法有点困惑,特别是您在let部分中定义的变量应该属于当前集合,而不是您将要使用的集合查找。

尝试一下:

 db.getCollection('items').aggregate([
    {
        $match: {
            _id: ObjectId("5d2b9e2da676e50cb9d061fe")
        }
    },
    {
        $lookup: {
            from: 'commisions',
            let: {item: '$_id'},
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $in: [
                                '$$item',
                                {
                                    $map: {
                                        input: '$items',
                                        as: 'i',
                                        in: '$$i.item',
                                    }
                                }
                            ]
                        }
                    }
                }],
            as: 'commisions'
        }
    },
    {
        $project: {
            commisions: 1,
            commisionsSize: {$size: '$commisions'}
        }
    },
    {
        $limit: 100
    }
])