将MongoDB查询发送到其他系统:转换为JSON,然后解码为BSON? 用Go语言怎么做?

我需要将MongoDB查询转移到其他系统。 因此,我想使用 MongoDB扩展JSON 。 我之所以需要这样做,主要是因为我在查询中使用了日期比较。</ p>

因此,问题的核心在于我需要转移在<中生成的MongoDB查询。 em> node.js </ em>后端到另一个用 Go </ em>语言编写的后端。</ p>

直觉上,这是发送此查询的最明显的格式 通过 REST </ em>,是JSON。 但是,MongoDB查询不完全是JSON,而是BSON,其中包含日期的特殊构造。</ p>

因此,其想法是使用 MongoDB扩展JSON 作为特殊结构的表示形式。 经过一些测试后,很明显这些查询不起作用。 MongoDB shell和通过 node.js </ em>发送的查询都需要特殊的 ISODate </ code>或 new Date </ code>构造。</ p>
\ n

最后,一个实际的问题是:是否存在将 MongoDB扩展JSON ,是否同时使用JavaScript(node.js)和 Go </ em>语言?</ p>

更新</ h1>

Node.js编码包</ h2>

显然有一个 node.js </ em>程序包,该程序可以解析并字符串化BSON / JSON。
因此,我的问题已解决了一半。 我想知道在 Go </ em>语言中是否存在类似的内容。 </ p>

示例查询</ h2>

例如,以下查询使用的是常规BSON:</ p>

  {  Tmin:{$ gt:ISODate(“ 2006-01-01T23:00:00.000Z”)}} 
</ code> </ pre>

已翻译为 MongoDB扩展JSON </ em>,它变为:</ p>

  {“ Tmin”:{“ $ gt”:{“ $ date”:1136156400000}}} 
</ code> </ pre >
</ div>

展开原文

原文

I need to transfer a MongoDB query to a different system. For this reason I would like to use the MongoDB Extended JSON. I need this to be done mostly because I use date comparisons in my queries.

So, the kernel of the problem is that I need to transfer a MongoDB query that has been generated in a node.js back-end to another back-end written in Go language.

Intuitively, the most obvious format for sending this query via REST, is JSON. But, MongoDB queries are not exactly JSON, but BSON, which contains special constructs for dates.

So, the idea is to convert the queries into JSON using MongoDB Extended JSON as form of representation of the special constructs. After some tests it's clear that these queries do not work. Both the MongoDB shell and queries sent via node.js's need the special ISODate or new Date constructs.

Finally, the actual question: are there functions to encode/decode from JSON to BSON, taking into account MongoDB Extended JSON, both in JavaScript (node.js) and Go language?

Updates

Node.js encoding package

Apparently there is a node.js package that parses and stringifies BSON/JSON. So, half of my problem is resolved. I wonder if there is something like this in Go language.

Sample query

For example, the following query is in normal BSON:

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

Translated into MongoDB Extended JSON, it becomes:

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

dongqiao1158
dongqiao1158 当然,我只是添加了一个示例BSON查询,它是JSON版本
接近 6 年之前 回复
douti8321
douti8321 出于好奇,您可以发布示例JSON文档吗?
接近 6 年之前 回复

1个回答

After some research I found the mejson library, however it's for Marshaling only, so I decided to write an Unmarshaller.

Behold ejson (I wrote it), right now it's a very simple ejson -> bson converter, there's no bson -> ejson yet, you can use mejson for that.

An example:

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
", 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
", m)

}
doupu1957
doupu1957 惊人。 有效! 谢谢! :)
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐