文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用 golang for MongoDB 创建分页过滤器

2024-02-05 22:26

关注

问题内容

我有一个很大的过滤器,我将提供它的一个片段。我试图通过异教化过滤器的映射,但收到错误消息

the match filter must be an expression in an object

获取过滤器

func (app *courses) getfilter(filter *filter) ([]bson.m, error) {
    
        pipeline := make([]bson.m, 0)
    
        if filter.all {
            // include all items
        } else {
            // filter items based on the provided criteria
            if filter.beginner {
                pipeline = append(pipeline, bson.m{"tags": "beginner"})
            }
            if filter.advanced {
                pipeline = append(pipeline, bson.m{"tags": "advanced"})
            }
            if filter.go {
                pipeline = append(pipeline, bson.m{"tags": "go"})
            }
        }
    
        return pipeline, nil
    }

处理程序

func (app *courses) coursesallhandler(w http.responsewriter, r *http.request) {
    ctx := context.background()

    clog := log.getloggerfromcontext(ctx)

    p := r.url.query().get("page")
    ps := r.url.query().get("pagesize")

    var filter filter
    err := json.newdecoder(r.body).decode(&filter)
    if err != nil {
        http.error(w, "failed to parse request body", http.statusbadrequest)
        return
    }

    pipeline := make([]bson.m, 0)

    page, _ := strconv.atoi(p)
    pagesize, _ := strconv.atoi(ps)

    // pagination
    skip := (page - 1) * pagesize
    limit := pagesize

    // add filter
    pipeline, err = app.getfilter(&filter)
    if err != nil {
        clog.error(err)
    }
    pipeline = append(pipeline, bson.m{"$match": pipeline})

    // add pagination stages to the pipeline
    pipeline = append(pipeline, bson.m{"$skip": skip})
    pipeline = append(pipeline, bson.m{"$limit": limit})

    res, err := app.repo.getall(ctx, pipeline)
    if err != nil {
        clog.error(err)

        return
    }

    err = app.helper.writejson(w, http.statusok, envelope{"data": res, "metadata": "none"}, nil)
    if err != nil {
        clog.errorctx(err, log.ctx{
            "header":      w.header(),
            "request_url": r.url.string(),
        })
    }

}

如何获取设置为“true”或“false”的值,将它们放入地图中并在查询中提交它们以匹配数据库,就像我在这里尝试做的那样。

// add filter
pipeline, err = app.getfilter(&filter)
if err != nil {
    clog.error(err)
}
pipeline = append(pipeline, bson.m{"$match": pipeline})

----更新----

我现在有:

func (app *courses) coursesallhandler(w http.responsewriter, r *http.request) {
    ctx := context.background()

clog := log.getloggerfromcontext(ctx)

var filter filter
err := json.newdecoder(r.body).decode(&filter)
if err != nil {
    http.error(w, "failed to parse request body", http.statusbadrequest)
    return
}

filter.all = true

pipeline := make([]bson.m, 3)

// add filter
matches, err := app.getfilter(&filter)
if err != nil {
    clog.error(err)
}

pipeline[0] = bson.m{"$skip": 1}
pipeline[1] = bson.m{"$limit": 5}
pipeline[2] = bson.m{"$match": matches}


res, err := app.repo.getall(ctx, pipeline)
if err != nil {
    clog.error(err)

    return
}

err = app.helper.writejson(w, http.statusok, envelope{"data": res, "metadata": "none"}, nil)
if err != nil {
    clog.errorctx(err, log.ctx{
        "header":      w.header(),
        "request_url": r.url.string(),
    })
 }

}

过滤器看起来像

func (app *courses) getfilter(filter *filter) (bson.m, error) {

    match := bson.m{}
    tags := []string{}

    if filter.all {
        // include all items
        tags = append(tags, "beginner")
        tags = append(tags, "intermediate")
        .....
    } else {
        // filter items based on the provided criteria
        if filter.beginner {
            tags = append(tags, "beginner")
        }
        if filter.advanced {
            tags = append(tags, "advanced")
        }
        if filter.go {
            tags = append(tags, "go")
        }
        ........

    }

    match = bson.m{
        "tags": bson.m{"$in": tags},
    }

    return match, nil
}

稍后将在这里使用..

func (r *CourseRepo) GetAll(ctx context.Context, pipeline []bson.M) ([]Course, error) {
    clog := log.GetLoggerFromContext(ctx)

    cur, err := r.collection.Aggregate(ctx, pipeline)

    ...

但是它是空的。过滤器中的所有内容均已选择,没有错误。


正确答案


您得到的 匹配过滤器必须是对象 中的表达式,因为 $match 需要一个对象 (bson.m),但您已经给了 slice 对象 ([]bson.m)

试试这个

func (app *Courses) getFilter(filter *Filter) (bson.M, error) {
    match := bson.M{}
    tags := []string{}

    if filter.All {
        // Include all items
    } else {
        // Filter items based on the provided criteria
        if filter.Beginner {
            tags = append(tags, "beginner")
        }
        if filter.Advanced {
            tags = append(tags, "advanced")

        }
        if filter.Go {
            tags = append(tags, "go")
        }

        match = bson.M{
            "tags": bson.M{"$in": tags},
        }
    }

    return match, nil
}

以上就是使用 golang for MongoDB 创建分页过滤器的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯