金灿湖 發表於 2022-2-10 16:35:00

golang操作MongoDB

<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package main

import (
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">context</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">go.mongodb.org/mongo-driver/bson</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">go.mongodb.org/mongo-driver/bson/primitive</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">go.mongodb.org/mongo-driver/mongo</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">go.mongodb.org/mongo-driver/mongo/options</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">go.mongodb.org/mongo-driver/mongo/readpref</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">log</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">time</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
)

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据结构体</span>
type Test <span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> {
    Id    </span><span style="color: rgba(0, 0, 255, 1)">string</span> `bson:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">`
    Name</span><span style="color: rgba(0, 0, 255, 1)">string</span> `bson:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">`
    Level </span><span style="color: rgba(0, 0, 255, 1)">int</span>    `bson:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">level</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">`
}

</span><span style="color: rgba(0, 0, 255, 1)">var</span> db *mongo.Database         <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> database 话柄</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> collection *mongo.Collection <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> collection 话柄

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">1、pool连接池模式</span>
func ConnectToDB(uri, name <span style="color: rgba(0, 0, 255, 1)">string</span>, timeout time.Duration) (*<span style="color: rgba(0, 0, 0, 1)">mongo.Database, error) {
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置连接超时时间</span>
    ctx, cancel :=<span style="color: rgba(0, 0, 0, 1)"> context.WithTimeout(context.Background(), timeout)
    defer cancel()
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过传进来的uri连接相关的配置</span>
    o :=<span style="color: rgba(0, 0, 0, 1)"> options.Client().ApplyURI(uri)
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 发起链接</span>
    client, err :=<span style="color: rgba(0, 0, 0, 1)"> mongo.Connect(ctx, o)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil, err
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 判断服务是不是可用</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> err = client.Ping(context.Background(), readpref.Primary()); err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> nil, err
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回 client</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> client.Database(name), nil
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">2、新增一条数据</span>
func AddOne(t *<span style="color: rgba(0, 0, 0, 1)">Test) {
    objId, err :</span>= collection.InsertOne(context.TODO(), &amp;<span style="color: rgba(0, 0, 0, 1)">t)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Println(err)
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
    }
    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">录入数据成功,objId:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, objId)
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">3、删除一条数据</span>
<span style="color: rgba(0, 0, 0, 1)">func Del(m bson.M) {
    deleteResult, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> collection.DeleteOne(context.Background(), m)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.DeleteOne:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, deleteResult)
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">4、编辑一条数据</span>
func EditOne(t *<span style="color: rgba(0, 0, 0, 1)">Test, m bson.M) {
    update :</span>= bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$set</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: t}
    updateResult, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> collection.UpdateOne(context.Background(), m, update)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.UpdateOne:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, updateResult)
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">5、更新数据 - 存在更新,不存在就新增</span>
func Update(t *<span style="color: rgba(0, 0, 0, 1)">Test, m bson.M) {
    update :</span>= bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$set</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: t}
    updateOpts :</span>= options.Update().SetUpsert(<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
    updateResult, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> collection.UpdateOne(context.Background(), m, update, updateOpts)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.UpdateOne:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, updateResult)
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">6、模糊查询</span>
<span style="color: rgba(0, 0, 0, 1)">func Sectle(m bson.M) {
    cur, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> collection.Find(context.Background(), m)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err := cur.Err(); err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }

    </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> cur.Next(context.Background()) {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> t Test
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> err = cur.Decode(&amp;t); err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
            log.Fatal(err)
      }
      log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.Find name=primitive.Regex{xx}: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, t)
    }
    _ </span>=<span style="color: rgba(0, 0, 0, 1)"> cur.Close(context.Background())
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">7、准确搜索一条数据</span>
<span style="color: rgba(0, 0, 0, 1)">func GetOne(m bson.M) {
    </span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> one Test
    err :</span>= collection.FindOne(context.Background(), m).Decode(&amp;<span style="color: rgba(0, 0, 0, 1)">one)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.FindOne: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, one)
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">8、获取多条数据</span>
<span style="color: rgba(0, 0, 0, 1)">func GetList(m bson.M) {
    cur, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> collection.Find(context.Background(), m)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err := cur.Err(); err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    </span><span style="color: rgba(0, 0, 255, 1)">var</span> all []*<span style="color: rgba(0, 0, 0, 1)">Test
    err </span>= cur.All(context.Background(), &amp;<span style="color: rgba(0, 0, 0, 1)">all)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(err)
    }
    _ </span>=<span style="color: rgba(0, 0, 0, 1)"> cur.Close(context.Background())

    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.Find curl.All: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, all)
    </span><span style="color: rgba(0, 0, 255, 1)">for</span> _, one :=<span style="color: rgba(0, 0, 0, 1)"> range all {
      log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Id:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, one.Id, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> - name:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, one.Name, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> - level:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, one.Level)
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">9、统计collection的数据总数</span>
<span style="color: rgba(0, 0, 0, 1)">func Count() {
    count, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> collection.CountDocuments(context.Background(), bson.D{})
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      log.Fatal(count)
    }
    log.Println(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">collection.CountDocuments:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, count)
}
func main() {
    uri :</span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mongodb://admin:123456@10.168.4.61:27017/admin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    name :</span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Test</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    maxTime :</span>= time.Duration(<span style="color: rgba(128, 0, 128, 1)">2</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 链接超时时间</span>
    table := <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">test</span><span style="color: rgba(128, 0, 0, 1)">"</span>             <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 表名</span>
<span style="color: rgba(0, 0, 0, 1)">
    db, err :</span>=<span style="color: rgba(0, 0, 0, 1)"> ConnectToDB(uri, name, maxTime)
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> err !=<span style="color: rgba(0, 0, 0, 1)"> nil {
      panic(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">链接数据库有误!</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
    }

    collection </span>=<span style="color: rgba(0, 0, 0, 1)"> db.Collection(table)

    t :</span>=<span style="color: rgba(0, 0, 0, 1)"> Test{
      Id:    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      Name:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">zngw</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
      Level: </span><span style="color: rgba(128, 0, 128, 1)">55</span><span style="color: rgba(0, 0, 0, 1)">,
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加一条数据</span>
    AddOne(&amp;<span style="color: rgba(0, 0, 0, 1)">t)

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> EditOne 编辑一条数据</span>
    t.Name = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">guoke</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    EditOne(</span>&amp;t, bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">})

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 删除一条数据</span>
    Del(bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">})

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 更新数据 - 存在更新,不存在就新增</span>
    Update(&amp;t, bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">_id</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">})

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Sectle 模糊查询</span>
    Sectle(bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: primitive.Regex{Pattern: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">guo</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}})

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 准确搜索一条数据</span>
    GetOne(bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">guoke</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">})

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 统计collection的数据总数</span>
<span style="color: rgba(0, 0, 0, 1)">    Count()

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> GetList 获取多条数据</span>
    GetList(bson.M{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">level</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 128, 1)">55</span><span style="color: rgba(0, 0, 0, 1)">})
}</span></pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    Mamba never out<br><br>
来源:https://www.cnblogs.com/yuhong1103/p/15879777.html
頁: [1]
查看完整版本: golang操作MongoDB