首先我是要查询文章列表和其访问量,其次有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-ObjectIdmongoose_Mongoose-Typesmongodb官方文档

标签: mongoose, mongodb, aggregate

仅有一条评论

  1. 感谢分享 赞一个

添加新评论