Go 中 MongoDB BSON 的 EDMA 类型使用案例

0 阅读1分钟

BSON

BSON(Binary JSON,MongoDB 的数据格式)中的 EDMA 类型

  • E: Element (键值对元素)
  • D: Document (有序文档,保持插入顺序)
  • M: Map (无序文档,类似Go的map)
  • A: Array (数组)

E 类型:bson.E

一个普普通通的键值对结构体,Value 可以是其他三个

import "go.mongodb.org/mongo-driver/bson"

// 创建一个简单的键值对
e := bson.E{Key: "name", Value: "Alice"}

// 嵌套其他BSON类型
nestedE := bson.E{
    Key: "profile",
    Value: bson.D{
        {Key: "age", Value: 30},
        {Key: "active", Value: true},
    },
}

D 类型:bson.D

本质上一个 E 的切片

import "go.mongodb.org/mongo-driver/bson"

// 创建有序文档
filter := bson.D{
    {Key: "age", Value: bson.D{{Key: "$gt", Value: 25}}},
    {Key: "status", Value: "active"},
}

// 用于复杂查询条件
query := bson.D{
    {Key: "$and", Value: bson.A{
        bson.D{{Key: "price", Value: bson.D{{Key: "$lt", Value: 100}}}},
        bson.D{{Key: "quantity", Value: bson.D{{Key: "$gt", Value: 0}}}},
    }},
}

M 类型:bson.M

本质上一个 Map,key 必须是 string,value 是 any,也可以是其他三种

import "go.mongodb.org/mongo-driver/bson"

// 创建无序文档
doc := bson.M{
    "name":    "Bob",
    "age":     42,
    "hobbies": bson.A{"reading", "cycling"},
    "address": bson.M{
        "city":    "New York",
        "zipcode": "10001",
    },
}

// 用于更新操作
update := bson.M{
    "$set": bson.M{
        "lastLogin": time.Now(),
        "status":    "online",
    },
}

A 类型:bson.A

切片,元素可以是其他三种

import "go.mongodb.org/mongo-driver/bson"

// 创建数组
hobbies := bson.A{"swimming", "hiking", "cooking"}

// 混合类型数组
mixedArray := bson.A{
    123,
    "string value",
    true,
    bson.D{{Key: "nestedDoc", Value: "value"}},
    bson.M{"key": "value"},
    bson.A{1, 2, 3},
}