Изпращане на 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, но тя е само за Marshaling, така че реших да напиша 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