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(), &<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(&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(&<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(), &<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(&<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>&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(&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> </p>
</div>
<div id="MySignature" role="contentinfo">
Mamba never out<br><br>
来源:https://www.cnblogs.com/yuhong1103/p/15879777.html
頁:
[1]