将SQL联接查询转换为MongoDB

时间:2019-11-03 13:04:57

标签: sql mongodb

我在sql中有此查询

select * from SupplyItem si
inner join categories c on si.categories = c._id
inner join suppliers s on si.supplier = s._id
inner join products p on p.supplier = s._id

我在mongodb中需要此查询

我被困在

内部连接产品p在p.supplier = s._id

我当前的查询是

SupplyItem.aggregate([{
        $lookup: {
            from: 'categories',
            localField: 'categories',
            foreignField: '_id',
            as: 'categoriess'
        }

    }, 
    {
        $lookup: {
            from: 'suppliers',
            localField: 'supplier',
            foreignField: '_id',
            as: 'suppliers'
        },

    },

])

我需要根据供应商对产品收款进行计数

1 个答案:

答案 0 :(得分:0)

您可以尝试

db.supplyitem.aggregate([
//categories are not required to get count of products by supplier
// {$lookup:{from:'categories',localField:'categories',foreignField:'_id',as:'categories'},
// {$unwind:'$categories'},
{$lookup:{from:'suppliers',localField:'supplier',foreignField:'_id',as:'suppliers'}},
{$unwind:'$suppliers'},
{$lookup:{from:'products',localField:'_id',foreignField:'supplier',as:'products'}},
{$unwind:'$products'},
//to get count of products
{$group:{_id:'$suppliers._id',docs:{$addToSet:'$products'}}},
{$unwind:'$_id'},
{$project:{_id:0,supplier:'$_id',productsCount:{$size:'$products'}}}
])

//end result: you will get the supplier id & products count. 
//if you need the supplier name as well (assuming the field is 'name'), you can change the $group as follows
{$group:{_id:{supplier_id:'$suppliers._id',supplier_name:'$suppliers.name'},docs:{$addToSet:'$products'}}},
{$unwind:'$_id'},
{$project:{_id:0,supplier_id:'$_id.supplier_id',supplier_name:'$_id.supplier_name',productsCount:{$size:'$products'}}}