Отправка запроса MongoDB в другую систему: преобразование в JSON и последующее декодирование в BSON? Как это сделать на языке Go?

Мне нужно передать запрос MongoDB в другую систему. По этой причине я хотел бы использовать MongoDB Extended JSON. Мне нужно это сделать в основном потому, что я использую сравнение дат в своих запросах.

Итак, суть проблемы в том, что мне нужно передать запрос MongoDB, сгенерированный в серверной части node.js, в другую серверную часть, написанную на Go. язык.

Интуитивно понятно, что наиболее очевидным форматом для отправки этого запроса через REST является JSON. Но запросы MongoDB — это не совсем JSON, а BSON, который содержит специальные конструкции для дат.

Итак, идея состоит в том, чтобы преобразовать запросы в JSON, используя MongoDB Extended JSON как форма представления специальных конструкций. После некоторых тестов становится ясно, что эти запросы не работают. И оболочке MongoDB, и запросам, отправляемым через node.js, нужны специальные конструкции ISODate или new Date.

Наконец, актуальный вопрос: существуют ли функции для кодирования/декодирования из JSON в BSON с учетом MongoDB Extended JSON как на языке JavaScript (node.js), так и на языке Go?

Обновления

Пакет кодирования Node.js

По-видимому, существует пакет node.js, который анализирует и упорядочивает BSON/JSON. Итак, половина моей проблемы решена. Интересно, есть ли что-то подобное в языке Go?

Пример запроса

Например, следующий запрос находится в обычном формате BSON:

{ Tmin: { $gt: ISODate("2006-01-01T23:00:00.000Z") } }

В переводе на MongoDB Extended JSON это выглядит так:

{ "Tmin": { "$gt" : { "$date" : 1136156400000 }}}

person fstab    schedule 09.08.2014    source источник
comment
Из любопытства, можете ли вы опубликовать образец документа JSON?   -  person OneOfOne    schedule 11.08.2014
comment
Конечно, я только что добавил образец запроса BSON и его версию JSON.   -  person fstab    schedule 11.08.2014


Ответы (1)


После некоторых исследований я нашел библиотеку mejson, однако она предназначена только для маршалинга, поэтому я решил написать Unmarshaller.

Вот ejson (это я написал), прямо сейчас это очень простой преобразователь ejson -> bson, есть пока нет bson -> ejson, для этого можно использовать mejson.

пример:

const j = `{"_id":{"$oid":"53c2ab5e4291b17b666d742a"},"last_seen_at":{"$date":1405266782008},"display_name":{"$undefined":true},
"ref":{"$ref":"col2", "$id":"53c2ab5e4291b17b666d742b"}}`

type TestS struct {
    Id          bson.ObjectId `bson:"_id"`
    LastSeenAt  *time.Time    `bson:"last_seen_at"`
    DisplayName *string       `bson:"display_name,omitempty"`
    Ref         mgo.DBRef     `bson:"ref"`
}

func main() {
    var ts TestS
    if err := ejson.Unmarshal([]byte(j), &ts); err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", ts)

    //or to convert the ejson to bson.M

    var m map[string]interface{}
    if err := json.Unmarshal([]byte(j), &m); err != nil {
        t.Fatal(err)
    }
    err := ejson.Normalize(m)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", m)

}
person OneOfOne    schedule 11.08.2014