查询设备列表页,并且根据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},
],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}));
})
})
});
}
-------------------------------------------------------------------------------------------
前端的查询参数
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},
],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}));
})
})
});
}