mgo is het instellen objectid om objectidhex, die niet schijnt te krijgen gelezen door MongoDB

stemmen
0

Ik ben op zoek naar een query met behulp van de ObjectId te maken, en normaal in MongoDB zou je zoiets als dit

db.collection.findOne({_id:objectid(5d9d90e5ed645489aae6df64)})

Welke dit werkt wanneer ik een normale vraag doen, maar in go lang het geeft het de waarde van

ObjectIdHex(5d9d90e5ed645489aae6df64)

in plaats die niet leidt tot een geldige query.

Ik heb door de mgo documentatie te lezen vele malen probeert te gebruiken

bson.ObjectId(5d9d90e5ed645489aae6df64)

maar het maakt het een hex die ik niet begrijp nog steeds. Ik heb geprobeerd een paar verschillende combinatie van dingen zonder dat ze waren vrijwel alleen opnamen in het donker.

Ga Lang Handlers

package userhandlers

import (
    log
    net/http
    //fmt
    //go.mongodb.org/mongo-driver/bson/primitive
    //go.mongodb.org/mongo-driver/bson
    labix.org/v2/mgo/bson

    //Services
    databaseservice malikiah.io/services/databaseService
    passwordservice malikiah.io/services/passwordService

    //Structs
    userstructs malikiah.io/structs/userStructs
    databasestructs malikiah.io/structs/databaseStructs
)

func LoginHandler(response http.ResponseWriter, request *http.Request) {
    response.Header().Set(Content-Type, application/json)
    response.WriteHeader(http.StatusOK)

    databaseQuery := databasestructs.Find{
        ID: bson.ObjectId(request.FormValue(_id)),
        MongoCollection: users,
        Criteria: _id,
        CriteriaValue: ,
        FindAll: false,
    }
    log.Println(databaseQuery)
    databaseservice.Login(databaseQuery)
}

Ga Lang Structs

package databasestructs

import (
    //go.mongodb.org/mongo-driver/bson/primitive
    labix.org/v2/mgo/bson
)

type Find struct {
    ID                      bson.ObjectId   `json:_id,omitempty bson:_id,omitempty`
    MongoCollection         string              `json:mongoCollection,omitempty bson:mongoCollection,omitempty`
    Criteria                string              `json:criteria,omitempty bson:criteria,omitempty`
    CriteriaValue           string              `json:criteriaValue,omitempty bson:criteriaValue,omitempty`
    FindAll                 bool                `json:findAll,omitempty bson:findAll,omitempty`
}

Ga Lang Functies

package databaseservice

import (
    context
    log

    //Structs
    userstructs malikiah.io/structs/userStructs
    databasestructs malikiah.io/structs/databaseStructs

    //go.mongodb.org/mongo-driver/bson
    go.mongodb.org/mongo-driver/mongo
    go.mongodb.org/mongo-driver/mongo/options
    gopkg.in/mgo.v2/bson

)

func Find(databaseQuery databasestructs.Find) (result string) {
    // Set client options
    clientOptions := options.Client().ApplyURI(mongodb://localhost:27017)

    // Connect to MongoDB
    client, err := mongo.Connect(context.TODO(), clientOptions)

    // Database name
    db := client.Database(malikiah)
    collection := db.Collection(databaseQuery.MongoCollection)

    if err != nil {
        log.Fatal(err)
    }

    if databaseQuery.Criteria == _id {
        log.Println(databaseQuery.ID)
        result := collection.FindOne(context.TODO(), bson.M{databaseQuery.Criteria: databaseQuery.ID}).Decode(&result)
        log.Println(result)
    } else if databaseQuery.Criteria ==  {

    } else if databaseQuery.FindAll == true {

    } else {

    }
    return
}
De vraag is gesteld op 09/10/2019 om 12:53
bron van user
In andere talen...                            


1 antwoorden

stemmen
2

Merk op dat labix.org/v2/mgois niet meer onderhouden, als u wilt gebruiken mgo, te gebruiken github.com/globalsign/mgoin plaats daarvan. Of de nieuwe, officiële Mongo-go driver .

bson.ObjectIdis een type met stringals onderliggende Type:

type ObjectId string

Dus wanneer u uw object te vullen als volgt uit:

databaseQuery := databasestructs.Find{
    ID: bson.ObjectId(request.FormValue("_id")),
    MongoCollection: "users",
    Criteria: "_id",
    CriteriaValue: "",
    FindAll: false,
}

bson.ObjectId(request.FormValue("_id"))is "niets meer" dan een type conversie . U converteren de hexadecimale object ID tekenreeks bson.ObjectId, maar dit is niet wat je wilt. U wilt ontleden de hex object ID. Daarvoor gebruik maken van de functie :bson.ObjectIdHex()

databaseQuery := databasestructs.Find{
    ID: bson.ObjectIdHex(request.FormValue("_id")),
    MongoCollection: "users",
    Criteria: "_id",
    CriteriaValue: "",
    FindAll: false,
}

Merk op dat bson.ObjectIdHex()zal paniek als de doorgegeven string is een ongeldige hex object ID. Gebruik bson.IsObjectIdHex()om het te controleren voorafgaand aan het bellen bson.ObjectId(). Zie voor meer informatie Prevent runtime paniek in bson.ObjectIdHex .

Als u de officiële bestuurder in plaats van zou gebruiken mgo, kan je gebruik maken van primitive.ObjectIDFromHex()de functie om het te maken ObjectId, bijvoorbeeld:

id, err := primitive.ObjectIDFromHex(request.FormValue("_id"))
if err != nil {
    // Handle error
    return
}
// If no error, you may use it:
databaseQuery := databasestructs.Find{
    ID: id,
    // ...
}
antwoordde op 09/10/2019 om 13:08
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more