问题内容
我有一个很大的过滤器,我将提供它的一个片段。我试图通过异教化过滤器的映射,但收到错误消息
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
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机使用 golang for MongoDB 创建分页过滤器
后端开发2024-02-05
Vue中怎么创建并使用过滤器
后端开发2024-04-02
使用golang中的过滤器从mongodb复合集合中获取所有数据
后端开发2024-02-06
咦!没有更多了?去看看其它编程学习网 内容吧