МдО устанавливает ObjectID к objectidhex, который не кажется, чтобы читать MongoDB

голоса
0

Я пытаюсь сделать запрос, используя ObjectId, и, как правило, в MongoDB вы могли бы сделать что-то вроде этого

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

Что это работает, когда я делаю обычный запрос, но в ходу языке он дает ей значение

ObjectIdHex(5d9d90e5ed645489aae6df64)

вместо этого, который не приводит к действительному запроса.

Я прочитал документацию ЕЙ много раз пытаемся использовать

bson.ObjectId(5d9d90e5ed645489aae6df64)

но он по-прежнему делает это шестигранный, который я не понимаю. Я попробовал несколько различных сочетаний вещей с не как они были в значительной степени только выстрелы в темноте.

Перейти Lang Обработчики

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

Перейти Lang структур

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

Перейти Lang Функции

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
}
Задан 09/10/2019 в 12:53
источник пользователем
На других языках...                            


1 ответов

голоса
2

Обратите внимание , что labix.org/v2/mgoэто больше не поддерживается, если вы хотите использовать mgo, используйте github.com/globalsign/mgoвместо этого. Или новый, официальный драйвер Монго-го .

bson.ObjectIdпредставляет собой тип , имеющий в stringкачестве своего базового типа:

type ObjectId string

Поэтому, когда вы заполняете свой объект, как это:

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

bson.ObjectId(request.FormValue("_id"))это «не более» , то тип преобразования . Вы преобразовать строку шестнадцатеричного идентификатора объекта к bson.ObjectId, но это не то , что вы хотите. Вы хотите , чтобы разобрать шестнадцатеричный идентификатор объекта. Для этого используйте функцию :bson.ObjectIdHex()

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

Обратите внимание , что bson.ObjectIdHex()будет паниковать , если переданная строка является недействительным шестигранным идентификатором объекта. Используйте , bson.IsObjectIdHex()чтобы проверить его перед вызовом bson.ObjectId(). Для получения дополнительной информации см Предотвращение выполнения паники в bson.ObjectIdHex .

Если вы будете использовать официальный драйвер вместо mgo, вы можете использовать primitive.ObjectIDFromHex()функцию для создания ObjectId, например:

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,
    // ...
}
Ответил 09/10/2019 в 13:08
источник пользователем

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