mgo est mise à objectid objectidhex, qui ne marche pas semblent se lire par MongoDB

voix
0

Je suis en train de faire une requête à l'aide ObjectId, et normalement mongodb vous feriez quelque chose comme ça

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

Ce qui cela fonctionne quand je fais une requête normale mais aller lang il lui donne la valeur de

ObjectIdHex(5d9d90e5ed645489aae6df64)

au lieu qui ne conduit pas à une requête valide.

J'ai lu dans la documentation de mgo plusieurs fois en essayant d'utiliser

bson.ObjectId(5d9d90e5ed645489aae6df64)

mais il fait encore un hexagone que je ne comprends pas. Je l'ai essayé quelques combinaisons différentes de choses sans comme ils étaient à peu près juste des coups dans l'obscurité.

Go 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)
}

Go 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`
}

Go Lang Fonctions

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
}
Créé 09/10/2019 à 12:53
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
2

Notez que labix.org/v2/mgon'est plus maintenu, si vous voulez utiliser mgo, utilisez à la github.com/globalsign/mgoplace. Ou le nouveau, officiel pilote mongo-go .

bson.ObjectIdest un type ayant stringcomme type sous - jacent:

type ObjectId string

Ainsi, lorsque vous remplissez votre objet comme celui-ci:

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

bson.ObjectId(request.FormValue("_id"))est « rien de plus » , puis un type de conversion . Vous convertissez l'objet hex chaîne d'identification à bson.ObjectId, mais c'est pas ce que vous voulez. Vous voulez analyser l'ID d'objet hexagonal. Pour cela, utilisez la fonction :bson.ObjectIdHex()

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

Notez que bson.ObjectIdHex()paniquent si la chaîne passée est un ID d'objet hex non valide. Utilisez bson.IsObjectIdHex()le vérifier avant d'appeler bson.ObjectId(). Pour plus de détails, voir éviter la panique d'exécution dans bson.ObjectIdHex .

Si vous utilisez le pilote officiel au lieu de mgo, vous pouvez utiliser la primitive.ObjectIDFromHex()fonction pour créer ObjectId, par exemple:

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,
    // ...
}
Créé 09/10/2019 à 13:08
source utilisateur

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