使用mongoose进行连表查询并分组($group),筛选($match),指定字段($project),批量查询($in)

const arrAttribute = await models.institutionAttributes.aggregate(
                [
                    {
                        $lookup:连表关键词,类似mysql中的left join 
                        {
                            from: "exhibition_institutions",//需要连接的表名
                            localField: "_id",//本表需要关联的字段
                            foreignField: "attribute",//被连接表需要关联的字段
                            as: "institutionsData"//查询出的结果集别名
                        }
                    },
                    {
                        $match://条件筛选关键词,类似mysql中的where
                        {
                            _id: mongoose.Types.ObjectId(team),//指定条件,在这里我指定了id,
                        }
                    },
                    {
                        $project://指定查询字段的关键词
                        {
                            _id: 0,//由于会默认展示_id,在这里设置为0,不展示
                            name: 1,//展示一个字段名称为name的字段
                            "institutionsData._id": 1,//同上
                        }
                    },
                ]
            );
			//下面这一段可以忽略,只是对结果进行筛选
            let arrAttributeSort = [];
            for (let i = 0; i < arrAttribute.length; i++) {
                for (let j = 0; j < arrAttribute[i].institutionsData.length; j++) {
                    arrAttributeSort.push(arrAttribute[i].institutionsData[j]._id);
                }
            }
            const signData = await models.exhibitionItem.aggregate(
                [
                    {
                        $lookup:
                        {
                            from: "signups",
                            localField: "_id",
                            foreignField: "exhibition_item",
                            as: "signInstitutionsData"
                        }
                    },
                    {
                        $match:
                        {
                            "signInstitutionsData": { $ne: [] },//$ne:[]用来剔除结果集中的空数组
                            from: { $gte: parseInt(from) },,//大于等于
                            to: { $lte: parseInt(to) },//小于等于
                            "signInstitutionsData.institutions.institution": { $in: arrAttributeSort }//$in是批量查询,[1,2,3,4,5]这种形式的数组可以直接进行查询
                        }
                    },
                    {
                        $project:
                        {
                            _id: 0,
                            "signInstitutionsData.unit_name": 1,
                            "signInstitutionsData.institutions": 1
                        }
                    }
                ]
            );

猜你喜欢

转载自blog.csdn.net/qq_42427109/article/details/86470924
今日推荐