zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Go --- 简单操作MongoDB

2023-03-14 22:41:16 时间

依赖包的选择:

impor "go.mongodb.org/mongo-driver/mongo"

go.mod中写入

require go.mongodb.org/mongo-driver v1.9.0

连接

简单连接

// 简单连接
func main() {
    clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct")
    client, err := mongo.Connect(context.TODO(), clientOpts)
    if err != nil {
        log.Fatal(err)
    }
    // context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间
    if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil {
        fmt.Println("Connected to MongoDB!")
    }
}

分片连接

// shard分片连接
func main() {
   clientOpts := options.Client().ApplyURI("mongodb://localhost:27017,localhost:27018")
   client, err := mongo.Connect(context.TODO(), clientOpts)
   if err != nil {
      log.Fatal(err)
   }
   err = client.Ping(context.TODO(), clientOpts.ReadPreference)
   if err == nil {
      fmt.Println("Pong")
   }
}

操作

结构体

// User 如果字段不大写的话mongoDB就没办法插入该字段
type User struct {
    Id int64
    Name string
    Password    string
}

insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("插入一条数据",insert.InsertedID)
    // 插入多个文档
    users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}}
    insertMany, err := collection.InsertMany(context.TODO(), users)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("插入多条数据",insertMany.InsertedIDs)

// 获取单条信息
var result User
err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result)
if err != nil {
   log.Fatal(err)
}
fmt.Printf("单条查询结果为 %+v
",result)
// 获取多条信息
findOptions := options.Find()
findOptions.SetLimit(2)
// 获取多条信息并返回一个游标
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
    log.Fatal(err)
}
// 通过迭代获取所有信息
for cur.Next(context.TODO()) {
    var elem User
    err := cur.Decode(&elem)
    if err != nil {
        log.Fatal(err)
    }
    results = append(results, elem)
}
if err := cur.Err(); err != nil {
        log.Fatal(err)
}
// 查询结束后关闭游标
cur.Close(context.TODO())
fmt.Printf("查询多条数据%+v
",results)

// 更新一条数据
filter := bson.D{{"name","张三"}}
update := bson.D{{
   "$set",bson.D{
      {"Password","321"},
   },
}}
updateOne, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
   log.Fatal(err)
}
fmt.Println("更新一条数据",updateOne.ModifiedCount)

// 删除所有数据
many, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
    log.Fatal(err)
}
fmt.Println("删除所有数据",many.DeletedCount)

完整代码

// 简单连接
func main() {
    clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?connect=direct")
    client, err := mongo.Connect(context.TODO(), clientOpts)
    if err != nil {
        log.Fatal(err)
    }
    // context.Background() 一般只是用来做测试或是初始化使用,因为没有上下文,而且也没有设置截止时间
    if ok := client.Ping(context.TODO(), clientOpts.ReadPreference);ok == nil {
        fmt.Println("Connected to MongoDB!")
    }
    // 断开连接
    defer func() {
        err = client.Disconnect(context.TODO())
        if err != nil {
            log.Fatal(err)
        }
    }()
    // 获取一个集合
    collection := client.Database("test").Collection("user")
    // 删除所有数据
    many, err := collection.DeleteMany(context.TODO(), bson.D{{}})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("删除所有数据",many.DeletedCount)
    // 插入一个文档
    insert, err := collection.InsertOne(context.TODO(),User{Id: 1,Name: "张三",Password: "123"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("插入一条数据",insert.InsertedID)
    // 插入多个文档
    users := []interface{}{User{Id: 2,Name: "李四",Password: "abc"},User{Id: 3,Name: "王五",Password: "hhh"}}
    insertMany, err := collection.InsertMany(context.TODO(), users)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("插入多条数据",insertMany.InsertedIDs)
    // 获取单条信息
    var result User
    err = collection.FindOne(context.TODO(), bson.D{{}}).Decode(&result)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("单条查询结果为 %+v
",result)
    // 更新一条数据
    filter := bson.D{{"name","张三"}}
    update := bson.D{{
        "$set",bson.D{
            {"Password","321"},
        },
    }}
    updateOne, err := collection.UpdateOne(context.TODO(), filter, update)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("更新一条数据",updateOne.ModifiedCount)
    // 获取多条信息
    findOptions := options.Find()
    findOptions.SetLimit(2)
    var results []User
    // 获取多条信息并返回一个游标
    cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
    if err != nil {
        log.Fatal(err)
    }
    // 通过迭代获取所有信息
    for cur.Next(context.TODO()) {
        var elem User
        err := cur.Decode(&elem)
        if err != nil {
            log.Fatal(err)
        }
        results = append(results, elem)
    }
    if err := cur.Err(); err != nil {
        log.Fatal(err)
    }
    // 查询结束后关闭游标
    cur.Close(context.TODO())
    fmt.Printf("查询多条数据%+v
",results)
}
// User 如果字段不大写的话mongoDB就没办法插入该字段
type User struct {
    Id int64
    Name string
    Password    string
}