跳到主要内容

数据交互: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 字面量编写聚合阶段或更新文档。

使用方法

  1. 以严格 JSON 粘贴查询、过滤条件或文档(键加引号,不使用 ObjectId(...) 或 ISODate(...) 等 shell 辅助函数)。
  2. 从 Go 面板复制 bson.M{...} 字面量;$gte、$in、$or 等操作符保留为字符串键。
  3. 导入 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。

规范与参考资料