【问题标题】:How do I convert a string type url param into an acceptable type for my mongodb query?如何将字符串类型的 url 参数转换为我的 mongodb 查询可接受的类型?
【发布时间】:2022-01-19 21:42:46
【问题描述】:

我正在尝试通过从 get 请求发送的 url 参数从我的 mongodb 中查找和检索相关数量的字段。

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/user", createUser).Methods("POST")
    r.HandleFunc("/suggest", searchCity).Methods("GET") // The route for the function

    fmt.Println("Server running at port 8080")
    log.Fatal(http.ListenAndServe(":8080", r))

}
func searchCity(w http.ResponseWriter, r *http.Request) {
    //ctx := context.Background()
    DB := setup() // setup() returns a mongo.Database type
    values := r.URL.Query()
    city := values.Get("city_name") // so the route would ultimately be `/suggest?city_name=<cityname>` (I think?)

    cityCollection := DB.Collection("city")

    cursor, err := cityCollection.Find(r.Context(), city) // options.Find().SetProjection(projection))
    if err != nil {
        log.Fatal(err)
    }

    var cityList []bson.M
    if err = cursor.All(r.Context(), &cityList); err != nil {
        log.Fatal(err)
    }
    for _, cityList := range cityList {
        fmt.Println(cityList["all_names"])
        fmt.Println(cityList["country_name"])
    }
}

我特别想从集合中返回all_namescountry_name 字段并尝试使用SetProjection(),但我可能使用不正确,因此不确定。

但是,我不断收到此错误:

cannot transform type string to a BSON Document: WriteString can only write while positioned on a Element or Value but is positioned on a TopLevel

有没有办法将其转换为 mongodb 驱动程序可以接受的格式?

【问题讨论】:

    标签: mongodb go


    【解决方案1】:

    documented错误提示,需要通过bson包使用bson对象查询mongodb。

    collection.Find(ctx, bson.D{{"name", city}})
    

    以下是一个工作示例,我根据您的评论对其进行了测试。

    package main
    
    import (
        "context"
        "encoding/json"
        "log"
        "net/http"
        "time"
    
        "go.mongodb.org/mongo-driver/bson"
        "go.mongodb.org/mongo-driver/bson/primitive"
        "go.mongodb.org/mongo-driver/mongo"
        "go.mongodb.org/mongo-driver/mongo/options"
    )
    
    func cityHandler(collection *mongo.Collection) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            ctx := r.Context()
            city := r.URL.Query().Get("city_name")
            var q bson.D
            if city != "" {
                q = bson.D{{"name", city}}
            } else {
                q = bson.D{{}}
            }
    
            cur, currErr := collection.Find(ctx, q)
            if currErr != nil {
                http.Error(w, currErr.Error(), http.StatusInternalServerError)
            }
            defer cur.Close(ctx)
    
            var result []primitive.M
            if err := cur.All(ctx, &result); err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
            }
    
            w.Header().Set("Content-Type", "application/json")
            err := json.NewEncoder(w).Encode(result)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
            }
    
        }
    }
    
    func main() {
        client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://root:example@localhost:27017"))
        if err != nil {
            panic(err)
        }
        ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
        defer cancel()
    
        err = client.Connect(ctx)
        if err != nil {
            panic(err)
        }
        defer client.Disconnect(ctx)
    
        docs := []interface{}{
            bson.D{{"name", "Wuhu"}},
            bson.D{{"name", "Shexian"}},
        }
    
        collection := client.Database("china").Collection("cities")
    
        _, err = collection.InsertMany(ctx, docs)
        if err != nil {
            panic(err)
        }
    
        http.HandleFunc("/", cityHandler(collection))
        log.Fatal(http.ListenAndServe(":8080", nil))
    
    }
    
    

    【讨论】:

    • 我以前试过这个,但我得到一个invalid field name "city" in struct literal 错误。
    • @Lazlo,我已经测试过了。而且我没有收到任何错误。它按照文档按预期工作。你用双花括号 {{}} 包裹它吗?你有正确的进口吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 2017-11-21
    • 2017-12-30
    • 2019-10-09
    • 1970-01-01
    相关资源
    最近更新 更多