Вставка дат в Монго с Голангом - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь создать соединитель Golang MongoDB, который принимает запрос от клиента и обновляет / вставляет тело запроса в базу данных. Пример тела запроса:

    {
        "_id": {
            "$oid": <hexOID>
        },
        "DateCreated": {
            "$date": 1460091636474
        },
        "DateModified": {
            "$date": 1542241349721
        }
    }

Используемый мной текущий драйвер Mongo и библиотека BSON расположены по адресу github.com/globalsign/mgo/ и github.com/globalsign/mgo/bson соответственно.

Всякий раз, когда я пытаюсь разобрать вышеприведенный ответ, я получаю сообщение об ошибке:

cannot parse date: "{\r\n        \"$date\": 1460091636474\r\n    }"

Я прочитал и увидел несколько ответов о создании собственного маршаллера / демаршаллера, но как мне поступить, если это решит эту проблему?

Подмножество моего кода выглядит следующим образом:

var update interface{}
errUpdate := bson.UnmarshalJSON(body, &update)
if errUpdate != nil {
    fmt.Println(errUpdate)
}
dbErr = collection.Update(query, update)

Я сохраняю обновление как интерфейс, поскольку передаваемое тело запроса постоянно изменяется и не является четко определенным.

1 Ответ

0 голосов
/ 21 ноября 2018

Прежде всего, формат JSON в вашем примере называется MongoDB Extended JSON .Это важно, так как вам нужно следовать формату расширенная дата JSON .Это либо $date со строкой ISO-8601, либо $date с $numberLong с эпохой Unix.

Другое примечание с Update, вам нужна операция обновления, т.е. $ set ,Если вы собираетесь заменить документ, используйте Replace.Хотя замена _id не совсем имеет смысла, в приведенном ниже примере будет использоваться Replace, как предполагается из примера.

Приведенный ниже пример документа в базе данных:

db.collection.insert({
              "_id": ObjectId("5bf36072a5820f6e28a4736c"),
              "Foo":1
})

Альтернативой использованию globalsign/mgo является использование пакета mongo-go-driver / bson , естьметод UnmarshalExtJSON () , который вы могли бы легко использовать для анализа расширенного JSON.

Используя текущую версию (0.0.18), пример будет:

import (
    "github.com/mongodb/mongo-go-driver/bson"
    "github.com/mongodb/mongo-go-driver/mongo"
)

replacement := bson.D{}
// Example of response body
data := `{"_id":{"$oid":"5bf36072a5820f6e28a4736c"},"DateModified":{"$date":{"$numberLong":"1542241349721"}},"DateCreated":{"$date":{"$numberLong":"1460091636474"}}}`

err = bson.UnmarshalExtJSON([]byte(data), true, &replacement)
if err != nil {
    log.Fatal(err)
}
query := bson.D{{"Foo", 1}}
replaceResult, err := c.ReplaceOne(context.Background(), query, replacement)
...