如何以美观格式查看mgo的bson.Raw及调试输出BSON数据?
解决mgo获取的BSON数据控制台调试输出问题
嘿,我刚好碰到过和你一样的调试需求,给你几个实用的办法来把mgo获取的BSON数据清晰输出到控制台:
方法1:使用扩展JSON格式化输出(保留BSON类型信息)
如果你希望输出的内容既易读,又能保留BSON特有的类型(比如ObjectID、日期、二进制数据这些JSON无法原生表示的类型),可以用bson.MarshalExtJSON方法,它能把BSON转成带类型标记的扩展JSON,非常适合调试。
示例代码:
import ( "fmt" "time" // 旧版mgo用这个导入 // "gopkg.in/mgo.v2/bson" // 新版官方驱动用这个(很多项目已经迁移到这里) "go.mongodb.org/mongo-driver/bson" ) func main() { // 假设doc是你从mgo查询到的BSON文档(bson.M或者自定义结构体实例) doc := bson.M{ "_id": bson.NewObjectId(), "name": "Kurayami", "age": 30, "created_at": time.Now(), } // 第二个参数设为true表示添加缩进,第三个参数设为true表示输出类型信息 jsonBytes, err := bson.MarshalExtJSON(doc, true, true) if err != nil { panic(err) } fmt.Println(string(jsonBytes)) }
输出结果会像这样(带清晰缩进和类型标记):
{ "_id": {"$oid": "60d21b4667d0d8992e610c85"}, "name": "Kurayami", "age": 30, "created_at": {"$date": 1624390470123} }
方法2:旧版mgo专属的bson.Dump函数(一键打印调试信息)
如果你用的是旧版的mgo库(gopkg.in/mgo.v2),它自带了一个bson.Dump函数,专门用来快速打印BSON文档的调试信息,不需要自己处理序列化,直接输出到控制台。
示例代码:
import ( "gopkg.in/mgo.v2/bson" ) func main() { doc := bson.M{"name": "test", "age": 25, "active": true} // 直接调用Dump,会自动格式化输出到stdout bson.Dump(doc) }
输出会是类似这样的结构化内容:
--- { "name": "test", "age": 25, "active": true }
方法3:处理原始BSON字节数组的情况
如果你拿到的是从MongoDB直接读取的原始BSON字节数组([]byte类型),可以先把它反序列化成bson.M(或者对应的结构体),再用上面的方法输出:
import ( "fmt" "gopkg.in/mgo.v2/bson" ) func main() { // 假设rawBson是你获取的原始BSON字节 var rawBson []byte = []byte{/* 你的BSON字节数据 */} var doc bson.M err := bson.Unmarshal(rawBson, &doc) if err != nil { panic(err) } // 然后用Dump或者MarshalExtJSON输出 bson.Dump(doc) }
对比你处理JSON的方式,这些方法就是BSON调试的等效方案——bson.MarshalExtJSON类似json.MarshalIndent,而bson.Dump则是更轻量化的一键调试打印工具。
内容的提问来源于stack exchange,提问作者Kurayami
相关产品推荐
相关产品推荐

