mongoose聚合查询多表联查
首先我是要查询文章列表和其访问量,其次有2个表分别是infos(文章)
和signs(访问记录)
表。
这里我使用的是express+mongoose
问题
1.分页查询
2.如何联查
3.查询字段合并到主集合上返回
首先我们所有参数都在body
对象中
//处理分页默认
body.pageNo = body.pageNo || 2;
body.pageSize = body.pageSize || 10;
//处理关键词
const reg = new RegExp(body.searchInput || ".*", 'i')
let select = {
$or: [
{title: {$regex: reg}},
{name: {$regex: reg}},
{address: {$regex: reg}},
{hospital: {$regex: reg}},
{phone: {$regex: reg}},
]
}
分页查询
分页查询并不是什么问题,百度可以解决。提供2种方法。
1.使用函数
InfoModel.find(select).sort({ 'updateTime': -1 }).skip((body.pageNo - 1) * body.pageSize).limit(parseInt(body.pageSize)||10).exec(function(err,docs){
if(err){
return reject(err);
}
resolve(docs)
})
2.使用聚合函数$skip
和$limit
,我使用的这种方法,代码最后贴出来。
进行多表联查
首先我百度到的大部分都是差不多的代码,但是我使用不了。我只统计访问数量
//这是百度的方法。
$lookup:
{
from:"users",
localField:"list._id.teacherId",
foreignField: "_id",
as: "users"
}
以上方法为百度,原文地址
下面看我的方法
function admQuery(body) {
//处理分页默认
body.pageNo = body.pageNo || 2;
body.pageSize = body.pageSize || 10;
//处理关键词
const reg = new RegExp(body.searchInput || ".*", 'i')
return new Promise((resolve, reject) => {
let select = {
$or: [
{title: {$regex: reg}},
{name: {$regex: reg}},
{address: {$regex: reg}},
{hospital: {$regex: reg}},
{phone: {$regex: reg}},
]
}
InfoModel.aggregate([
{$match: select},
{$skip: (body.pageNo - 1) * body.pageSize},
{$limit: body.pageSize},
{
$lookup: {
from: "signs",
as: "sign",
//定义变量,下面好做条件判断
"let": {"baseId": "$id"},
'pipeline': [
{
$match: {
//这里要使用baseId必须的使用expr
"$expr": { "$eq": [ "$iid", "$$baseId" ] }
}
},
// {$group: {_id: '$iid', count: {$sum: 1}}},
//计算条数
{$count:'count'},
// {$project: {_id: '$_id', count: 1}},
],
}
},
{
$addFields:{
//添加signCount字段,将sign中的count提取出来
signCount:{$arrayElemAt:['$sign.count',0]}
}
},
{
$project:{
//去除sign字段
sign:0
}
}
]).exec(function (err, docs) {
if (err) {
return reject(err);
}
resolve(docs)
})
})
}
注意:如果关联_id
进行查询需要注意他的类型是ObjectId
,需要进行转换,相关文档mongoose_Mongoose-ObjectId、mongoose_Mongoose-Types、mongodb官方文档。
感谢分享 赞一个