inital commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
mongo_crud
|
||||
64
.golangci.yml
Normal file
64
.golangci.yml
Normal file
@@ -0,0 +1,64 @@
|
||||
linters-settings:
|
||||
govet:
|
||||
check-shadowing: true
|
||||
gocyclo:
|
||||
min-complexity: 20
|
||||
maligned:
|
||||
suggest-new: true
|
||||
dupl:
|
||||
threshold: 200
|
||||
goconst:
|
||||
min-len: 2
|
||||
min-occurrences: 2
|
||||
misspell:
|
||||
locale: US
|
||||
lll:
|
||||
line-length: 140
|
||||
goimports:
|
||||
local-prefixes: github.com/golangci/golangci-lint
|
||||
gocritic:
|
||||
enabled-tags:
|
||||
- performance
|
||||
- style
|
||||
- experimental
|
||||
disabled-checks:
|
||||
- wrapperFunc
|
||||
|
||||
linters:
|
||||
disable-all: true
|
||||
enable:
|
||||
- govet
|
||||
- gocyclo
|
||||
- dupl
|
||||
- lll
|
||||
- gosec
|
||||
- dupl
|
||||
- goconst
|
||||
# - depguard
|
||||
- misspell
|
||||
- goimports
|
||||
# - gocritic
|
||||
- staticcheck
|
||||
- deadcode
|
||||
- errcheck
|
||||
- unused
|
||||
- gosimple
|
||||
- structcheck
|
||||
- varcheck
|
||||
- ineffassign
|
||||
- typecheck
|
||||
- bodyclose
|
||||
- unconvert
|
||||
- unparam
|
||||
- prealloc
|
||||
- whitespace
|
||||
- exportloopref
|
||||
|
||||
run:
|
||||
tests: false
|
||||
go: "1.21"
|
||||
skip-dirs:
|
||||
- swagger-ui
|
||||
- configs
|
||||
- templates
|
||||
- \.go
|
||||
23
Makefile
Normal file
23
Makefile
Normal file
@@ -0,0 +1,23 @@
|
||||
start:
|
||||
docker compose -p mongo -f deployments/docker-compose.yml up -d
|
||||
|
||||
stop:
|
||||
docker compose -p mongo down
|
||||
|
||||
clean:
|
||||
rm -f ./mongo_crud
|
||||
|
||||
build: clean
|
||||
go build .
|
||||
|
||||
run: build
|
||||
./mongo_crud
|
||||
|
||||
mongosh:
|
||||
mongosh "mongodb://root:example@127.0.0.1:27017/?authSource=admin"
|
||||
|
||||
aggregate:
|
||||
mongosh "mongodb://root:example@127.0.0.1:27017/?authSource=admin" --file aggregate.js
|
||||
|
||||
import:
|
||||
mongoimport --db=strava --collection=workout "mongodb://root:example@127.0.0.1:27017/?authSource=admin" backup.json
|
||||
40
aggregate.js
Normal file
40
aggregate.js
Normal file
@@ -0,0 +1,40 @@
|
||||
db = connect( 'mongodb://root:example@127.0.0.1:27017/strava?authSource=admin' );
|
||||
|
||||
let result = db.workout.aggregate([{
|
||||
$match: {
|
||||
type: 'Run'
|
||||
}
|
||||
}, {
|
||||
$set: {
|
||||
date: {
|
||||
$dateFromString: {
|
||||
dateString: '$start_date'
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
$group: {
|
||||
_id: {
|
||||
$dateToString: {
|
||||
format: '%Y-%m',
|
||||
date: '$date'
|
||||
}
|
||||
},
|
||||
totalMonthDistance: {
|
||||
$sum: {
|
||||
$divide: [
|
||||
'$distance',
|
||||
1000
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
$match: {
|
||||
totalMonthDistance: {
|
||||
$gte: 150
|
||||
}
|
||||
}
|
||||
}]);
|
||||
|
||||
console.log(result);
|
||||
53
command.js
Normal file
53
command.js
Normal file
@@ -0,0 +1,53 @@
|
||||
db.books.insertOne({
|
||||
title: 'gRPC: запуск и эксплуатация облачных приложений. Go и Java для Docker и Kubernetes',
|
||||
author: 'Касун Индрасири',
|
||||
year: 2020
|
||||
})
|
||||
|
||||
db.books.insertMany([
|
||||
{ title: 'Go: идиомы и паттерны проектирования', author: 'Боднер Джон', year: 2022 },
|
||||
{
|
||||
title: 'Высоконагруженные приложения. Программирование, масштабирование, поддержка',
|
||||
author: 'Клеппман Мартин',
|
||||
year: 2021
|
||||
}
|
||||
])
|
||||
|
||||
// Найти все документы
|
||||
db.books.find()
|
||||
// Найти документы по совпадению конкретного поля
|
||||
db.books.find({ year: 2021 })
|
||||
// Найти документы по условию на кокретное поле
|
||||
db.books.find({ year: { $gte: 2021 } })
|
||||
// Найти документы по условию на кокретное поле и вернуть первый
|
||||
db.books.findOne({ year: { $gte: 2021 } })
|
||||
// Найти документа по одному ИЛИ по второму условию.
|
||||
db.books.find({ $or: [{ year: { $gte: 2021 } }, { author: 'Касун Индрасири' }] })
|
||||
|
||||
db.books.findOne({ year: { $gte: 2021 } }, { title: 1, _id: 0 })
|
||||
db.books.findOne({ year: { $gte: 2021 } }, { title: 0, _id: 0 })
|
||||
|
||||
db.books.updateOne(
|
||||
{
|
||||
title: 'Высоконагруженные приложения. Программирование, масштабирование, поддержка'
|
||||
},
|
||||
{ $set: { rating: 5 } }
|
||||
)
|
||||
|
||||
db.books.updateMany({ rating: null }, { $set: { rating: 3 } })
|
||||
|
||||
db.books.replaceOne(
|
||||
{ author: 'Ньюмен Сэм' },
|
||||
{
|
||||
title: 'Создание микросервисов',
|
||||
author: 'Ньюмен Сэм',
|
||||
year: 2016,
|
||||
rating: 3
|
||||
},
|
||||
{ upsert: true }
|
||||
)
|
||||
|
||||
db.books.countDocuments()
|
||||
|
||||
db.books.deleteOne({ author: 'Ньюмен Сэм' })
|
||||
db.books.deleteMany({ rating: { $lt: 5 } })
|
||||
24
delete.go
Normal file
24
delete.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
func deleteAllRows(ctx context.Context, coll *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "deleteAllRows")
|
||||
defer span.End()
|
||||
|
||||
result, err := coll.DeleteMany(ctx, bson.D{})
|
||||
if err != nil {
|
||||
log.Fatal(result)
|
||||
}
|
||||
|
||||
fmt.Println("Remove all documents...")
|
||||
fmt.Printf("%d documents removed\n", result.DeletedCount)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
41
deployments/docker-compose.yml
Normal file
41
deployments/docker-compose.yml
Normal file
@@ -0,0 +1,41 @@
|
||||
version: "3.9"
|
||||
services:
|
||||
mongo:
|
||||
image: "mongo"
|
||||
restart: always
|
||||
ports:
|
||||
- 27017:27017
|
||||
environment:
|
||||
MONGO_INITDB_ROOT_USERNAME: root
|
||||
MONGO_INITDB_ROOT_PASSWORD: example
|
||||
|
||||
mongo-express:
|
||||
image: mongo-express
|
||||
restart: always
|
||||
ports:
|
||||
- 8081:8081
|
||||
environment:
|
||||
ME_CONFIG_MONGODB_ADMINUSERNAME: root
|
||||
ME_CONFIG_MONGODB_ADMINPASSWORD: example
|
||||
ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/
|
||||
|
||||
otel-collector:
|
||||
image: otel/opentelemetry-collector:latest
|
||||
container_name: otel-collector
|
||||
command: ["--config=/etc/otel-collector-config.yaml"]
|
||||
volumes:
|
||||
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
|
||||
ports:
|
||||
- "4317:4317"
|
||||
depends_on:
|
||||
- jaeger
|
||||
|
||||
jaeger:
|
||||
image: jaegertracing/all-in-one:latest
|
||||
container_name: jaeger
|
||||
environment:
|
||||
- COLLECTOR_OTLP_ENABLED=true
|
||||
- COLLECTOR_OTLP_GRPC_HOST-PORT=:4317
|
||||
- COLLECTOR_OTLP_GRPC_HOST_PORT=:4317
|
||||
ports:
|
||||
- "16686:16686"
|
||||
19
deployments/otel-collector-config.yaml
Normal file
19
deployments/otel-collector-config.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
receivers:
|
||||
otlp:
|
||||
protocols:
|
||||
grpc:
|
||||
endpoint: 0.0.0.0:4317
|
||||
processors:
|
||||
exporters:
|
||||
otlp:
|
||||
endpoint: "http://jaeger:4317"
|
||||
tls:
|
||||
insecure: true
|
||||
debug:
|
||||
verbosity: detailed
|
||||
service:
|
||||
pipelines:
|
||||
traces:
|
||||
receivers: [otlp]
|
||||
processors: []
|
||||
exporters: [otlp, debug]
|
||||
110
find.go
Normal file
110
find.go
Normal file
@@ -0,0 +1,110 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
func checkFindErr(err error) {
|
||||
if err != nil {
|
||||
if err == mongo.ErrNoDocuments {
|
||||
return
|
||||
}
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func findAll(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "findAll")
|
||||
defer span.End()
|
||||
|
||||
fmt.Println("replaceOne document...")
|
||||
cursor, err := col.Find(ctx, bson.M{})
|
||||
checkFindErr(err)
|
||||
|
||||
var books []Book
|
||||
err = cursor.All(ctx, &books)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Finded %d docs:\n%v\n", len(books), books)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
|
||||
func find(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "find")
|
||||
defer span.End()
|
||||
|
||||
opts := options.Find().SetSort(bson.M{"rating": 1})
|
||||
|
||||
cursor, err := col.Find(ctx, bson.M{"year": 2022}, opts)
|
||||
checkFindErr(err)
|
||||
|
||||
var books []Book
|
||||
err = cursor.All(ctx, &books)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Search documents where year equal 2022...")
|
||||
fmt.Printf("Finded %d docs:\n%v\n", len(books), books)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
|
||||
func findWithCondition(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "findWithCondition")
|
||||
defer span.End()
|
||||
|
||||
filter := bson.M{"year": bson.M{"$gt": 2020}}
|
||||
|
||||
cursor, err := col.Find(ctx, filter)
|
||||
checkFindErr(err)
|
||||
|
||||
var books []Book
|
||||
err = cursor.All(ctx, &books)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Search documents where year greather then 2020...")
|
||||
fmt.Printf("Finded %d docs:\n%v\n", len(books), books)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
|
||||
func findWithOrCondition(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "findWithOrCondition")
|
||||
defer span.End()
|
||||
|
||||
filter := bson.M{
|
||||
"$or": bson.A{
|
||||
bson.M{
|
||||
"year": bson.M{"$gte": 2020},
|
||||
},
|
||||
bson.M{
|
||||
"author": "Касун Индрасири",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
findOptions := options.Find()
|
||||
findOptions.SetProjection(bson.M{"author": 0})
|
||||
|
||||
cursor, err := col.Find(ctx, filter, findOptions)
|
||||
checkFindErr(err)
|
||||
|
||||
var books []Book
|
||||
err = cursor.All(ctx, &books)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Search documents where year greather then 2020 AND author is 'Касун Индрасири'...")
|
||||
fmt.Printf("Finded %d docs:\n%v\n", len(books), books)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
40
go.mod
Normal file
40
go.mod
Normal file
@@ -0,0 +1,40 @@
|
||||
module github.com/maksim77/mongo_crud
|
||||
|
||||
go 1.21
|
||||
|
||||
require (
|
||||
go.mongodb.org/mongo-driver v1.13.0
|
||||
go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.46.0
|
||||
go.opentelemetry.io/otel v1.20.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0
|
||||
go.opentelemetry.io/otel/sdk v1.20.0
|
||||
go.opentelemetry.io/otel/trace v1.20.0
|
||||
google.golang.org/grpc v1.59.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
|
||||
github.com/go-logr/logr v1.3.0 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 // indirect
|
||||
github.com/klauspost/compress v1.17.2 // indirect
|
||||
github.com/montanaflynn/stats v0.7.1 // indirect
|
||||
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
|
||||
github.com/xdg-go/scram v1.1.2 // indirect
|
||||
github.com/xdg-go/stringprep v1.0.4 // indirect
|
||||
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
|
||||
go.opentelemetry.io/otel/metric v1.20.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
|
||||
golang.org/x/crypto v0.15.0 // indirect
|
||||
golang.org/x/net v0.18.0 // indirect
|
||||
golang.org/x/sync v0.5.0 // indirect
|
||||
golang.org/x/sys v0.14.0 // indirect
|
||||
golang.org/x/text v0.14.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
)
|
||||
117
go.sum
Normal file
117
go.sum
Normal file
@@ -0,0 +1,117 @@
|
||||
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
|
||||
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY=
|
||||
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1 h1:6UKoz5ujsI55KNpsJH3UwCq3T8kKbZwNZBNPuTTje8U=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y=
|
||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
|
||||
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||
github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
|
||||
github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
|
||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
|
||||
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
|
||||
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
|
||||
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
|
||||
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
|
||||
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk=
|
||||
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY=
|
||||
go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
|
||||
go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.46.0 h1:1b/GR0eOpqQJ0kjJeuzDwqUzcQD3cnZgsAPlG8032BQ=
|
||||
go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo v0.46.0/go.mod h1:2nM/khnHtYdbPG/3dWxS8RN+t8/OChavUx5JZHdgAEM=
|
||||
go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc=
|
||||
go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0 h1:DeFD0VgTZ+Cj6hxravYYZE2W4GlneVH81iAOPjZkzk8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.20.0/go.mod h1:GijYcYmNpX1KazD5JmWGsi4P7dDTTTnfv1UbGn84MnU=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0 h1:gvmNvqrPYovvyRmCSygkUDyL8lC5Tl845MLEwqpxhEU=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.20.0/go.mod h1:vNUq47TGFioo+ffTSnKNdob241vePmtNZnAODKapKd0=
|
||||
go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA=
|
||||
go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM=
|
||||
go.opentelemetry.io/otel/sdk v1.20.0 h1:5Jf6imeFZlZtKv9Qbo6qt2ZkmWtdWx/wzcCbNUlAWGM=
|
||||
go.opentelemetry.io/otel/sdk v1.20.0/go.mod h1:rmkSx1cZCm/tn16iWDn1GQbLtsW/LvsdEEFzCSRM6V0=
|
||||
go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ=
|
||||
go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU=
|
||||
go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
|
||||
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA=
|
||||
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
|
||||
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
|
||||
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ=
|
||||
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=
|
||||
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
|
||||
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
|
||||
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
12
helpers.go
Normal file
12
helpers.go
Normal file
@@ -0,0 +1,12 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
)
|
||||
|
||||
func FollowSpan(ctx context.Context, name string) (_ context.Context, span trace.Span) {
|
||||
ctx, span = tracer.Start(ctx, name)
|
||||
return ctx, span
|
||||
}
|
||||
58
insert.go
Normal file
58
insert.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
func insertOne(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "insertOne")
|
||||
defer span.End()
|
||||
|
||||
fmt.Println("Inserting 1 documents...")
|
||||
result, err := col.InsertOne(ctx, book)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Printf("One document inserted with id: %s\n", result.InsertedID)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
|
||||
func insertMany(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "insertMany")
|
||||
defer span.End()
|
||||
|
||||
fmt.Println("Inserting 2 documents...")
|
||||
inserts := make([]interface{}, 0, len(books))
|
||||
for _, book := range books {
|
||||
inserts = append(inserts, book)
|
||||
}
|
||||
|
||||
result, err := col.InsertMany(ctx, inserts)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
fmt.Printf("%d documents inserted with ids: %v\n", len(result.InsertedIDs), result.InsertedIDs)
|
||||
|
||||
// ObjectID описание
|
||||
for _, v := range result.InsertedIDs {
|
||||
id := [12]byte(v.(primitive.ObjectID))
|
||||
byteTime := id[0:4]
|
||||
byteRandomID := id[4:9]
|
||||
byteInc := id[9:12]
|
||||
fmt.Printf("Timestamp: %d\n", binary.BigEndian.Uint32(byteTime))
|
||||
fmt.Printf("Timestamp to date: %v\n", time.Unix(int64(binary.BigEndian.Uint32(byteTime)), 0))
|
||||
fmt.Printf("Random val per process and machine: %d\n", binary.BigEndian.Uint32(byteRandomID))
|
||||
fmt.Printf("Inc counter: %d\n", binary.BigEndian.Uint16(byteInc))
|
||||
fmt.Println("*******")
|
||||
}
|
||||
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
93
main.go
Normal file
93
main.go
Normal file
@@ -0,0 +1,93 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
"go.opentelemetry.io/contrib/instrumentation/go.mongodb.org/mongo-driver/mongo/otelmongo"
|
||||
"go.opentelemetry.io/otel"
|
||||
)
|
||||
|
||||
var tracer = otel.Tracer("mongo_example")
|
||||
|
||||
const URI = "mongodb://127.0.0.1:27017"
|
||||
|
||||
func getClient(ctx context.Context) (*mongo.Client, error) {
|
||||
ctx, span := FollowSpan(ctx, "getClient")
|
||||
defer span.End()
|
||||
|
||||
opts := options.Client()
|
||||
opts.ApplyURI(URI)
|
||||
optsAuth := options.Credential{
|
||||
Username: "root",
|
||||
Password: "example",
|
||||
AuthSource: "admin",
|
||||
}
|
||||
|
||||
opts.SetAuth(optsAuth)
|
||||
|
||||
opts.Monitor = otelmongo.NewMonitor()
|
||||
|
||||
client, err := mongo.Connect(ctx, opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return client, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
|
||||
defer cancel()
|
||||
|
||||
shutdown, err := InstallExportPipeline()
|
||||
if err != nil {
|
||||
log.Fatal(err.Error())
|
||||
}
|
||||
defer func() {
|
||||
if err := shutdown(context.Background()); err != nil {
|
||||
log.Fatal(err.Error())
|
||||
}
|
||||
}()
|
||||
|
||||
// =========
|
||||
// ==START==
|
||||
// =========
|
||||
ctx, span := tracer.Start(ctx, "main")
|
||||
defer span.End()
|
||||
|
||||
// Создаём клиента
|
||||
client, err := getClient(ctx)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if mongoDisconectErr := client.Disconnect(ctx); mongoDisconectErr != nil {
|
||||
log.Println(mongoDisconectErr)
|
||||
}
|
||||
}()
|
||||
|
||||
// Все примеры будут для одной колллекции поэтому сразу создаём соответствующий объект
|
||||
col := client.Database("teta").Collection("books")
|
||||
|
||||
// Чтобы точно начать с чистого листа удалим коллекцию вообще.
|
||||
err = col.Drop(ctx)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
insertOne(ctx, col)
|
||||
insertMany(ctx, col)
|
||||
findAll(ctx, col)
|
||||
find(ctx, col)
|
||||
findWithCondition(ctx, col)
|
||||
findWithOrCondition(ctx, col)
|
||||
updateOne(ctx, col)
|
||||
updateMany(ctx, col)
|
||||
replaceOne(ctx, col)
|
||||
deleteAllRows(ctx, col)
|
||||
}
|
||||
33
model.go
Normal file
33
model.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Book struct {
|
||||
Title string `bson:"title"`
|
||||
Author string `bson:"author"`
|
||||
Year int `bson:"year"`
|
||||
Rating int `bson:"rating"`
|
||||
}
|
||||
|
||||
func (b Book) String() string {
|
||||
return fmt.Sprintf("{\n\tTtile: %s,\n\tAuthor: %s\n\tYear: %d\n\tRating: %d\n}\n", b.Title, b.Author, b.Year, b.Rating)
|
||||
}
|
||||
|
||||
var book Book = Book{
|
||||
Title: "gRPC: запуск и эксплуатация облачных приложений. Go и Java для Docker и Kubernetes",
|
||||
Author: "Касун Индрасири",
|
||||
Year: 2020,
|
||||
}
|
||||
|
||||
var books []Book = []Book{
|
||||
{
|
||||
Title: "Go: идиомы и паттерны проектирования",
|
||||
Author: "Боднер Джон",
|
||||
Year: 2022,
|
||||
},
|
||||
{
|
||||
Title: "Высоконагруженные приложения. Программирование, масштабирование, поддержка",
|
||||
Author: "Клеппман Мартин",
|
||||
Year: 2021,
|
||||
},
|
||||
}
|
||||
55
observability.go
Normal file
55
observability.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||
"go.opentelemetry.io/otel/propagation"
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
|
||||
)
|
||||
|
||||
func InstallExportPipeline() (func(context.Context) error, error) {
|
||||
traceClient := otlptracegrpc.NewClient(
|
||||
otlptracegrpc.WithInsecure(),
|
||||
otlptracegrpc.WithEndpoint("127.0.0.1:4317"),
|
||||
)
|
||||
sctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||
defer cancel()
|
||||
|
||||
traceExp, err := otlptrace.New(sctx, traceClient)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("creating stdout exporter: %w", err)
|
||||
}
|
||||
|
||||
res, err := resource.New(context.Background(),
|
||||
resource.WithFromEnv(),
|
||||
resource.WithProcess(),
|
||||
resource.WithTelemetrySDK(),
|
||||
resource.WithHost(),
|
||||
resource.WithAttributes(
|
||||
semconv.ServiceNameKey.String("go_test"),
|
||||
),
|
||||
)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
tracerProvider := sdktrace.NewTracerProvider(
|
||||
sdktrace.WithBatcher(traceExp),
|
||||
sdktrace.WithResource(res),
|
||||
)
|
||||
otel.SetTracerProvider(tracerProvider)
|
||||
otel.SetTextMapPropagator(propagation.TraceContext{})
|
||||
|
||||
return tracerProvider.Shutdown, nil
|
||||
}
|
||||
75
update.go
Normal file
75
update.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
func updateOne(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "updateOne")
|
||||
defer span.End()
|
||||
|
||||
filter := bson.M{
|
||||
"title": "Высоконагруженные приложения. Программирование, масштабирование, поддержка",
|
||||
}
|
||||
|
||||
update := bson.M{
|
||||
"$set": bson.M{"rating": 5},
|
||||
}
|
||||
|
||||
result, err := col.UpdateOne(ctx, filter, update)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Updating 1 documents...")
|
||||
fmt.Printf("Matched docs: %d. Updated docs: %d\n", result.MatchedCount, result.ModifiedCount)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
|
||||
func updateMany(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "updateMany")
|
||||
defer span.End()
|
||||
|
||||
filter := bson.M{
|
||||
"rating": 0,
|
||||
}
|
||||
|
||||
update := bson.M{
|
||||
"$set": bson.M{"rating": 3},
|
||||
}
|
||||
|
||||
result, err := col.UpdateMany(ctx, filter, update)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Updating many documents...")
|
||||
fmt.Printf("Matched docs: %d. Updated docs: %d\n", result.MatchedCount, result.ModifiedCount)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
|
||||
func replaceOne(ctx context.Context, col *mongo.Collection) {
|
||||
ctx, span := FollowSpan(ctx, "replaceOne")
|
||||
defer span.End()
|
||||
|
||||
fmt.Println("replaceOne document...")
|
||||
var updatedBook Book = Book{
|
||||
Author: "Ньюмен Сэм",
|
||||
Title: "Создание микросервисов",
|
||||
Year: 2016,
|
||||
}
|
||||
|
||||
result, err := col.ReplaceOne(ctx, bson.M{"author": "Ньюмен Сэм"}, updatedBook, options.Replace().SetUpsert(true))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Printf("Matched docs: %d. Updated docs: %d. Upserted docs: %d\n", result.MatchedCount, result.ModifiedCount, result.UpsertedCount)
|
||||
fmt.Println("=============================")
|
||||
}
|
||||
Reference in New Issue
Block a user