青帝-亚搏app下载-亚搏app下载ios

mongoDB是现在比较盛行的一个根据分布式文件存储的数据库,它是一个介于联络数据库和非联络数据库(NoSQL)之间的产品,对错联络数据库傍边功用最丰厚,最像联络数据库的。

mongoDB介绍

mongoDB是现在比较盛行的一个根据分布式文件存储的数据库,它是一个介于联络数据库和非联络数据库(NoSQL)之间的产品,对错联络数据库傍边功用最丰厚,最像联络数据库的。

mongoDB中将一条数据存储为一个文档(document),数据结构由键值(key-value)对组成。 其间文档类似于咱们往常编程中用到的JSON目标。 文档中的字段值能够包含其他文档,数组及文档数组。

mongoDB相关概念

mongoDB中相关概念与咱们了解的SQL概念比照如下:

MongoDB术语/概念阐明比照SQL术语/概念database数据库databasecollection调集tabledocument文档rowfield字段columnindexindex索引primary key主键 MongoDB主动将_id字段设置为主键primary key

macOS渠道除了在该网页下载TGZ文件外,还能够运用Homebrew装置。

更多装置细节能够参阅官方装置教程,里边有Linux、macOS和Windows三大干流渠道的装置教程。

mongoDB根本运用

发动mongoDB数据库

Windows

"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe" --dbpath="c:\data\db"

Mac

mongod --config /usr/local/etc/mongod.conf

brew services start mongodb-community@4.2

发动client

Windows

"C:\Program Files\MongoDB\Server\4.2\bin\mongo.exe"

Mac

mongo

数据库常用指令

show dbs;:查看数据库

> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB

use q1mi;:切换到指定数据库,假如不存在该数据库就创立。

> use q1mi;
switched to db q1mi

db;:显现当时地点数据库。

> db;
q1mi

db.dropDatabase():删去当时数据库

> db.dropDatabase();
{ "ok" : 1 }

数据集常用指令

db.createCollection(name,options):创立数据集

  • name:数据集称号
  • options:可选参数,指定内存大小和标签19索引。
> db.createCollection("student");
{ "ok" : 1 }

show collections;:查看当时数据库中一切调集。

> show collections;
student

db.student.drop():删去指定数据集

> db.student.drop()
true

文档常用指令

刺进一条文档:

> db.student.insertOne({name:"小王子",age:18});
{
"acknowledged" : true,
"insertedId" : ObjectId("5db149e904b33457f8c02509")青帝-亚搏app下载-亚搏app下载ios
}

刺进多条文档:

> db.student.insertMany([
... {name:"张三",age:20},
... {name:"李四",age:25}
... ]);
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5db14c4704b33457f8c0250a"),
ObjectId("5db14c4704b33457f8c0250b")
]
}

查询一切文档:

> db.student.find();
{ "_id" : ObjectId("5db149e904b33457f8c02509"), "name" : "小王子", "age" : 18 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250a"), "name" : "张三", "age" : 20 }
{ "_id" : Obje青帝-亚搏app下载-亚搏app下载iosctId("5db14c4704b33457f8c0250b"), "name" : "李四", "age" : 25 }

查询age>20岁的文档:

> db.student.find(
... {age:{$gt:20}}
... )
{ "_id" : ObjectId("5db14c4704b33457f8c02标签2050b"), "name" : "李四", "age" : 25 }

更新文档:

> db.student.update(
... {name:"小王子"},
... {name:"老王子",age:98}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : ObjectId("5db149e904b33457f8c02509"), "name" : "老王子", "age" : 98 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250a"), "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250b"), "name" : "李四", "age" : 25 }

删去文档:

> db.student.deleteOne({name:"李四"});
{ "acknowledged" : true, "deletedCount" : 1 }
> db.student.find()
{ "_id" : ObjectId("5db149e904b33457f8c02509"), "name" : "老王子", "age" : 98 }
{ "_id" : ObjectId("5db14c4704b33457f8c0250a"), "name" : "张三", "age" : 青帝-亚搏app下载-亚搏app下载ios20 }

指令真实太多,更多指令请参阅官方文档:shell指令和官方文档:CRUD操标签3作。

Go言语操作mongoDB

咱们这儿运用的是官方的驱动包,当然你也能够运用第三方的驱动包(如mgo等)。 mongoDB官方版的Go驱动发布的比较晚(2018年12月13号)。

装置mongoDB Go驱动包

go get github.com/mongodb/mongo-go-driver

经过Go代码衔接mongoDB

package main

import (
"context"
"fmt"
"log"

"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
// 设置客户端衔接装备
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")

// 衔接到MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}

// 查看衔接
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
}

衔接上MongoDB之后,能够经过下面的句子处理咱们上面的q1mi数据库中的student数据集了:

// 指定获取要操作的数据集
collection := client.Database("q1青帝-亚搏app下载-亚搏app下载iosmi").Collection("student")

处理完使命之后能够经过下面的指令断开与MongoDB的衔接:

// 断开衔接
err = client.Disconnect(context.TODO())
if err != nil {
log.Fatal(err)青帝-亚搏app下载-亚搏app下载ios
}
fmt.Println("Connection to MongoDB closed.")

BSON

MongoDB中的JSON文档存储在名为BSON(二进制编码的JSON)的二进制表明中。与其他将JSON数据存储为简略字符串和数字的数据库不同,BSON编码扩展了JSON表明,使其包含额定的类型,如int、long、date、浮点数和decimal128。这使得应用程序更简单可靠地处理、排序和比较数据。

衔接MongoDB的Go驱动程序中有两大类型表明BSON数据:D和Raw。

类型D宗族被用青帝-亚搏app下载-亚搏app下载ios来简练地构建运用本地Go类型的BSON目标。这关于结构传递给MongoDB的指令特别有用。D宗族包含四类:

  • D:一个BSON文档。这种类型应该在次序重要的情况下运用,比方MongoDB指令。
  • M:一张无序的map。它和D是相同的,仅仅它不坚持次序。
  • A:一个BSON数组。
  • E:D里边的一个元素。

要运用BSON,需求先导入下面的包:

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

下面是一个运用D类型构建的过滤器文档的比如,它能够用来查找name字段与’张三’或’李四’匹配的文档:

bson.D{{
"name",
bson.D{{
"$in",
bson.A{"张三", "李四"},
}},
}}

Raw类型宗族用于验证字节切片。你还能够运用Lookup()从原始类型检索单个元素。假如你不想要将BSON反序列化成另一种类型的开支,那么这对错常有用的。这个教程咱们将只运用D类型。

CRUD

咱们现在Go代码中界说一个Studet类型如下:

type Student struct {
Name string
Age int
}

接下来,创立一些Student类型的值,预备刺进到数据库中:

s1 := Student{"小红", 12}
s2 := Student{"小兰", 10}
s3 := Student{"小黄", 11}

刺进文档

运用collection.InsertOne()办法刺进一条文档记载:

insertResult, err :=标签11 collection.InsertOne(context.TODO标签11(), s1)
if err != nil {
log.Fatal(err)
}

fmt.Println("Inserted a single document: ", insertResult.InsertedID)

运用collection.InsertMany()办法刺进多条文档记载:

students := []interface{}{s2, s3}
insertManyResult, err := collection.InsertMany(context.TODO(), students)
if err != nil {
log.Fatal(err)
}
fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)

更新文档

updateone()办法答应你更新单个文档。它需求一个挑选器文档来匹配数据库中的文档,并需求一个更新文档来描绘更新操作。你能够运用bson.D类型来构建挑选文档和更新文档:

filter := bson.D{{"name", "小兰"}}

update := bson.D{
{"$inc", bson.D{
{"age", 1},
}},
}

接下来,就能够经过下面的句子找到小兰,给他添加一岁了:

updateResult, err := collection.UpdateOne(context.TODO(), filter, update)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Matched %v documents and updated %v document青帝-亚搏app下载-亚搏app下载ioss.\n", updateResult.MatchedCount, updateResult.ModifiedCount)

查找文档

要找到一个文档,你需求一个filter文档,以及一个指向能够将成果解码为其值的指针。要查找单个文档,运用collection.FindOne()。这个办法回来一个能够解码为值的成果。

咱们运用上面界说过的那个filter来查找姓名为’小兰’的文档。

// 创立一个Student变量用来接纳查询的成果
var result Student
err = collection.FindOne(context.TODO(), filter).Decode(&result)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found a single document: %+v\n", result)

要查找多个文档,请运用collection.Find()。此办法回来一个游标。游标供给了一个文档标签14流,你能够经过它一次迭代和解码一个文档。当游标用完之后,应该封闭游标。下面的示例将运用options包设置一个约束以便只回来两个文档。

// 查询多个
// 将选项传递给Find()
findOptions := options.Find()
findOptions.SetLimit(2)

// 界说一个切片用来存储查询成果
var results []*Student

// 把bson.D{{}}作为一个filter来匹配一切文档
cur, err := collection.Find(context.TODO(), bson.D{{}}, findOptions)
if err != nil {
log.Fatal(err)
}

// 查找多个文档回来一个光标
// 遍历游标答应咱们一次解码一个文档
for cur.Next(context.TODO()) {
// 创立一个值,将单个文档解码为该值
var elem Student
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("Found multiple documents (array of pointers): %#v\n", results)

删去文档

最终,能够运用collection.DeleteOne()或collection.DeleteMany()删去文档。假如你传递bson.D{{}}作为过滤器参数,它将匹配数据会集的一切文档。还能够运用collection. drop()删去整个数据集。

// 删去姓名是小黄的那个
deleteResult1, err := collection.DeleteOne(context.TODO(), bson.D{{"name","小黄"}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult1.DeletedCount)
// 删去一切
deleteResult2, err := collection.DeleteMany(context.TODO(), bson.D{{}})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Deleted %v documents in the trainers collection\n", deleteResult2.DeletedCount)

看更多的go言语,重视VX大众号:studytogo

声明:转载此文是出于李文周的博客的。如需转载,请注明出处,否则将追查法律责任。若有来历标示过错或侵犯了您的合法权益,请作者持权属证明与本网联络,咱们将及时更正、删去,谢谢。

Write a Comment

电子邮件地址不会被公开。 必填项已用 *标注