Heim >Backend-Entwicklung >Golang >Erstellen Sie Paginierungsfilter mit Golang für MongoDB
Ich habe einen großen Filter und werde einen Ausschnitt davon bereitstellen. Ich habe versucht, die Zuordnung des Paganisierungsfilters zu übergeben, habe aber die Fehlermeldung erhalten
the match filter must be an expression in an object
Filter erhalten
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 }
Handler
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(), }) } }
Wie erhalte ich die auf „wahr“ oder „falsch“ gesetzten Werte, füge sie in eine Karte ein und übermittle sie in einer Abfrage, damit sie mit der Datenbank übereinstimmen, wie ich es hier versuche.
// add filter pipeline, err = app.getfilter(&filter) if err != nil { clog.error(err) } pipeline = append(pipeline, bson.m{"$match": pipeline})
----Update----
Ich habe jetzt:
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(), }) } }
Der Filter sieht aus wie
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 }
Wird später hier verwendet..
func (r *CourseRepo) GetAll(ctx context.Context, pipeline []bson.M) ([]Course, error) { clog := log.GetLoggerFromContext(ctx) cur, err := r.collection.Aggregate(ctx, pipeline) ...
Aber es ist leer. Alles im Filter ist ausgewählt, keine Fehler.
Sie erhalten 匹配过滤器必须是对象
中的表达式,因为 $match
需要一个对象 (bson.m
),但您已经给了 slice 对象 ([]bson.m)
.
Probieren Sie es aus
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 }
Das obige ist der detaillierte Inhalt vonErstellen Sie Paginierungsfilter mit Golang für MongoDB. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!