node.js 关联查询列表页面

1 篇文章 0 订阅
1 篇文章 0 订阅
查询设备列表页,并且根据app、monitor的相关筛选条件查询
-------------------------------------------------------------------------------------------
前端的查询参数
objQuery: [
            {category: "iot"},
            {name: {$regex:""}},
            {status: ""},
            {refApp: ""},
            {local: {lng: 0, lat: 0, address: "",isShow:false}}


---------------------------------------------------------------------------------------------
//查询设备列表页面方法
findIOTList(token: string, pagination: Pagination, objQuery?: any) {
    let queryParam=[];
//根据前端回传的参数进行查询条件的配置
    for(let i in objQuery){
        if(objQuery[i].refApp!=null){
            if(objQuery[i].refApp!=""){
                queryParam.push({"refApp":Mongoose.Types.ObjectId(objQuery[i].refApp)})
            }
        }else if(objQuery[i].local!=null){


            if(objQuery[i].local.isShow){
                let lat=objQuery[i].local.lat;
                let lng=objQuery[i].local.lng;
                queryParam.push({"location.lat":{$gte:lat-0.02,$lte:lat+0.02},
                    "location.lng":{$gte:lng-0.02,$lte:lng+0.02}})
            }
        }else{
            queryParam.push(objQuery[i]);
        }
    }


    //关联表之后的状态查询信息
    let status={};
    //源表自带的查询信息
    let param={};


    //循环生成关联前后查询参数
    for(let i=0;i<queryParam.length;i++){
        if(queryParam[i].status!=null){
            if(queryParam[i].status!=""){
                //生成关联后查询条件(条件名对应关联后生成的字段,不可更改)
 //查询状态是在关联表之后匹配的,所以单独做一个$match的参数
                status={"monitorInfo.alertLevel":queryParam[i].status}
            }
        }else{
            //生成查询条件
//$match需要的是一个对象,所以将前端回传的多个对象并成一个对象
            let obj=queryParam[i];
            Object.keys(obj).forEach(function(key,i){
                param[key]=obj[key];


            })
        }




    }


    //生成关联查询语句(主表【datasources】关联【monitors、apps、products】)
    let lookupMonitor={
        from: "monitorobjects",//目标表名
            localField: "idStr",//源表字段
            foreignField: "objectSrcId",//目标表对应字段
            as: "monitorInfo"//关联后的名称
    };
    let lookupApp={
        from: "apps",//目标表名
        localField: "refApp",//源表字段
        foreignField: "_id",//目标表对应字段
        as: "appInfo"//关联后的名称
    };
    let lookupProduct={
        from: "products",//目标表名
        localField: "refProduct",//源表字段
        foreignField: "_id",//目标表对应字段
        as: "productInfo"//关联后的名称
    }
    //生成分页信息
    let skip=(pagination.pageNo - 1) * pagination.pageSize;
    let limit=pagination.pageSize;




    let sort = {};
    if (pagination.sort != null && pagination.sort != "")
        sort[pagination.sort] = pagination.order;
    else
        sort["_id"] = "-1";






    //计算分页数据
    return new Promise((resolve, reject) => {
        //查询列表
        DatasourceModel.aggregate([
            {$match:param},
            {$lookup:lookupMonitor},
            {$lookup:lookupApp},
            {$lookup:lookupProduct},
            {$match:status},

            { $sort:sort},

            { $skip :skip},

            { $limit:limit }
            
        ],function(err,list){
            if (err) reject(err);
            //计算总数
            DatasourceModel.aggregate([
                    {$match:param},
                    {$lookup:lookupMonitor},
                    {$lookup:lookupApp},
                    {$lookup:lookupProduct},
                    {$match:status},
                    {$addFields:{num:1}},
                    {$group:{_id:"$num",count:{$sum:1}}}
                ],function(e,total){
                if (err) reject(err);
                resolve(Response.success({total: total, results: list}));
            })




        })


    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值