首頁 > 後端開發 > Golang > 使用 golang for MongoDB 建立分頁篩選器

使用 golang for MongoDB 建立分頁篩選器

WBOY
發布: 2024-02-05 21:15:24
轉載
674 人瀏覽過

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

問題內容

我有一個很大的過濾器,我將提供它的一個片段。我試圖透過異教化過濾器的映射,但收到錯誤訊息

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 建立分頁篩選器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板