数据交互:JSON To Go Bson — Numio
把 JSON 文档改写为由 bson.M(对象)和 bson.A(数组)构成的 Go 字面量,供 MongoDB Go 驱动使用,并带上 Go 要求的末尾逗号。键保持原有顺序,null 变为 nil,字符串原样复制。
把在 mongosh 或 Compass 中测试过的 MongoDB 查询或过滤条件移植到 Go 代码中。
JSON
Go Bson
适用场景
- 把在 mongosh 或 Compass 中测试过的 MongoDB 查询或过滤条件移植到 Go 代码中。
- 在测试中以内联 Go 字面量编写聚合阶段或更新文档。
使用方法
- 以严格 JSON 粘贴查询、过滤条件或文档(键加引号,不使用 ObjectId(...) 或 ISODate(...) 等 shell 辅助函数)。
- 从 Go 面板复制 bson.M{...} 字面量;$gte、$in、$or 等操作符保留为字符串键。
- 导入 go.mongodb.org/mongo-driver/bson,把值传给 Find、UpdateOne 或 Aggregate,并按下文说明调整类型。
JSON 输入
{
"status": "active",
"deletedAt": null,
"age": { "$gte": 18 },
"tags": { "$in": ["go", "mongo"] },
"$or": [
{ "verified": true },
{ "score": { "$gt": 90 } }
]
}Go bson.M / bson.A
bson.M{
"status": "active",
"deletedAt": nil,
"age": bson.M{
"$gte": 18,
},
"tags": bson.M{
"$in": bson.A{
"go",
"mongo",
},
},
"$or": bson.A{
bson.M{
"verified": true,
},
bson.M{
"score": bson.M{
"$gt": 90,
},
},
},
}功能与限制
JSON 在浏览器中解析并遍历以构建字面量,不会向服务器发送任何内容。
null 变为 nil。数字是无类型的 Go 常量,因此 18 变为 int,1.5 变为 float64;超过 2^53 的整数在解析 JSON 时会丢失精度。
字符串以 Go 字符串字面量写出,因此其中的方括号或花括号(如 "tags[0]")保持不变。
输出的是无序的 bson.M。字段顺序重要时(例如排序文档或某些管道阶段)请使用 bson.D。
FAQ
可以粘贴带 ObjectId() 或 ISODate() 的 mongosh 查询吗?
不可以。输入必须是合法 JSON,shell 辅助函数会导致解析错误。请先用普通字符串,再在 Go 中替换为由 hex 生成的 ObjectID(驱动 v1 中为 primitive.ObjectIDFromHex)或 time.Time 值。
会生成 Go struct 吗?
不会,只生成 map 和 slice 字面量。如需带 json 标签的类型化 struct,请使用 JSON 转 Go 页面。
根节点必须是对象吗?
不必。根数组变为 bson.A{...},适合聚合管道,其中每个阶段是一个 bson.M。