mirror of
https://github.com/mainnika/mongox-go-driver.git
synced 2026-07-03 17:22:33 +00:00
Reexport basic mongo structs
This commit is contained in:
@@ -3,9 +3,9 @@ package database
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
|
|
||||||
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ func (d *Database) Count(target interface{}, filters ...interface{}) (int64, err
|
|||||||
opts.Skip = composed.Skipper()
|
opts.Skip = composed.Skipper()
|
||||||
|
|
||||||
result, err := collection.CountDocuments(d.Context(), composed.M(), opts)
|
result, err := collection.CountDocuments(d.Context(), composed.M(), opts)
|
||||||
if err == mongo.ErrNoDocuments {
|
if err == mongox.ErrNoDocuments {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
|
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
@@ -17,13 +16,13 @@ import (
|
|||||||
|
|
||||||
// Database handler
|
// Database handler
|
||||||
type Database struct {
|
type Database struct {
|
||||||
client *mongo.Client
|
client *mongox.Client
|
||||||
dbname string
|
dbname string
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDatabase function creates new database instance with mongo client and empty context
|
// NewDatabase function creates new database instance with mongo client and empty context
|
||||||
func NewDatabase(client *mongo.Client, dbname string) mongox.Database {
|
func NewDatabase(client *mongox.Client, dbname string) mongox.Database {
|
||||||
|
|
||||||
db := &Database{}
|
db := &Database{}
|
||||||
db.client = client
|
db.client = client
|
||||||
@@ -33,7 +32,7 @@ func NewDatabase(client *mongo.Client, dbname string) mongox.Database {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Client function returns a mongo client
|
// Client function returns a mongo client
|
||||||
func (d *Database) Client() *mongo.Client {
|
func (d *Database) Client() *mongox.Client {
|
||||||
return d.client
|
return d.client
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,7 +66,7 @@ func (d *Database) New(ctx context.Context) mongox.Database {
|
|||||||
// base.ObjectID `bson:",inline" json:",inline" collection:"foobars"`
|
// base.ObjectID `bson:",inline" json:",inline" collection:"foobars"`
|
||||||
// ...
|
// ...
|
||||||
// Will panic if there is no «collection» tag
|
// Will panic if there is no «collection» tag
|
||||||
func (d *Database) GetCollectionOf(document interface{}) *mongo.Collection {
|
func (d *Database) GetCollectionOf(document interface{}) *mongox.Collection {
|
||||||
|
|
||||||
el := reflect.TypeOf(document).Elem()
|
el := reflect.TypeOf(document).Elem()
|
||||||
numField := el.NumField()
|
numField := el.NumField()
|
||||||
@@ -86,7 +85,7 @@ func (d *Database) GetCollectionOf(document interface{}) *mongo.Collection {
|
|||||||
panic(fmt.Errorf("document %v does not have a collection tag", document))
|
panic(fmt.Errorf("document %v does not have a collection tag", document))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Database) createSimpleLoad(target interface{}, composed *query.Query) (cursor *mongo.Cursor, err error) {
|
func (d *Database) createSimpleLoad(target interface{}, composed *query.Query) (cursor *mongox.Cursor, err error) {
|
||||||
|
|
||||||
collection := d.GetCollectionOf(target)
|
collection := d.GetCollectionOf(target)
|
||||||
opts := options.Find()
|
opts := options.Find()
|
||||||
@@ -98,7 +97,7 @@ func (d *Database) createSimpleLoad(target interface{}, composed *query.Query) (
|
|||||||
return collection.Find(d.Context(), composed.M(), opts)
|
return collection.Find(d.Context(), composed.M(), opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Database) createAggregateLoad(target interface{}, composed *query.Query) (cursor *mongo.Cursor, err error) {
|
func (d *Database) createAggregateLoad(target interface{}, composed *query.Query) (cursor *mongox.Cursor, err error) {
|
||||||
|
|
||||||
collection := d.GetCollectionOf(target)
|
collection := d.GetCollectionOf(target)
|
||||||
opts := options.Aggregate()
|
opts := options.Aggregate()
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
|
|
||||||
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
||||||
)
|
)
|
||||||
@@ -38,7 +38,7 @@ func (d *Database) DeleteOne(target interface{}, filters ...interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
err := result.Decode(target)
|
err := result.Decode(target)
|
||||||
if err == mongo.ErrNoDocuments {
|
if err == mongox.ErrNoDocuments {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
|
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
||||||
)
|
)
|
||||||
@@ -36,7 +35,7 @@ func (d *Database) LoadArray(target interface{}, filters ...interface{}) error {
|
|||||||
zeroElem := reflect.Zero(targetSliceElemT)
|
zeroElem := reflect.Zero(targetSliceElemT)
|
||||||
hasPreloader, _ := composed.Preloader()
|
hasPreloader, _ := composed.Preloader()
|
||||||
|
|
||||||
var result *mongo.Cursor
|
var result *mongox.Cursor
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if hasPreloader {
|
if hasPreloader {
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ package database
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
|
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
||||||
)
|
)
|
||||||
@@ -15,7 +14,7 @@ func (d *Database) LoadOne(target interface{}, filters ...interface{}) error {
|
|||||||
composed := query.Compose(append(filters, query.Limit(1))...)
|
composed := query.Compose(append(filters, query.Limit(1))...)
|
||||||
hasPreloader, _ := composed.Preloader()
|
hasPreloader, _ := composed.Preloader()
|
||||||
|
|
||||||
var result *mongo.Cursor
|
var result *mongox.Cursor
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
if hasPreloader {
|
if hasPreloader {
|
||||||
@@ -32,7 +31,7 @@ func (d *Database) LoadOne(target interface{}, filters ...interface{}) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if !hasNext {
|
if !hasNext {
|
||||||
return mongo.ErrNoDocuments
|
return mongox.ErrNoDocuments
|
||||||
}
|
}
|
||||||
|
|
||||||
base.Reset(target)
|
base.Reset(target)
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package database
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
|
||||||
|
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/query"
|
||||||
)
|
)
|
||||||
@@ -12,7 +10,7 @@ import (
|
|||||||
// LoadStream function loads documents one by one into a target channel
|
// LoadStream function loads documents one by one into a target channel
|
||||||
func (d *Database) LoadStream(target interface{}, filters ...interface{}) (mongox.StreamLoader, error) {
|
func (d *Database) LoadStream(target interface{}, filters ...interface{}) (mongox.StreamLoader, error) {
|
||||||
|
|
||||||
var cursor *mongo.Cursor
|
var cursor *mongox.Cursor
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
composed := query.Compose(filters...)
|
composed := query.Compose(filters...)
|
||||||
@@ -27,7 +25,7 @@ func (d *Database) LoadStream(target interface{}, filters ...interface{}) (mongo
|
|||||||
return nil, fmt.Errorf("can't create find result: %w", err)
|
return nil, fmt.Errorf("can't create find result: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
l := &StreamLoader{Cursor: cursor, ctx: d.Context(), target: target}
|
l := &StreamLoader{cur: cursor, ctx: d.Context(), target: target}
|
||||||
|
|
||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,14 +4,13 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"github.com/mainnika/mongox-go-driver/v2/mongox"
|
||||||
|
|
||||||
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
"github.com/mainnika/mongox-go-driver/v2/mongox/base"
|
||||||
)
|
)
|
||||||
|
|
||||||
// StreamLoader is a controller for a database cursor
|
// StreamLoader is a controller for a database cursor
|
||||||
type StreamLoader struct {
|
type StreamLoader struct {
|
||||||
*mongo.Cursor
|
cur *mongox.Cursor
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
target interface{}
|
target interface{}
|
||||||
}
|
}
|
||||||
@@ -19,18 +18,18 @@ type StreamLoader struct {
|
|||||||
// DecodeNext loads next documents to a target or returns an error
|
// DecodeNext loads next documents to a target or returns an error
|
||||||
func (l *StreamLoader) DecodeNext() error {
|
func (l *StreamLoader) DecodeNext() error {
|
||||||
|
|
||||||
hasNext := l.Cursor.Next(l.ctx)
|
hasNext := l.cur.Next(l.ctx)
|
||||||
|
|
||||||
if l.Cursor.Err() != nil {
|
if l.cur.Err() != nil {
|
||||||
return l.Cursor.Err()
|
return l.cur.Err()
|
||||||
}
|
}
|
||||||
if !hasNext {
|
if !hasNext {
|
||||||
return mongo.ErrNoDocuments
|
return mongox.ErrNoDocuments
|
||||||
}
|
}
|
||||||
|
|
||||||
base.Reset(l.target)
|
base.Reset(l.target)
|
||||||
|
|
||||||
err := l.Cursor.Decode(l.target)
|
err := l.cur.Decode(l.target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("can't decode desult: %w", err)
|
return fmt.Errorf("can't decode desult: %w", err)
|
||||||
}
|
}
|
||||||
@@ -43,7 +42,7 @@ func (l *StreamLoader) Decode() error {
|
|||||||
|
|
||||||
base.Reset(l.target)
|
base.Reset(l.target)
|
||||||
|
|
||||||
err := l.Cursor.Decode(l.target)
|
err := l.cur.Decode(l.target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("can't decode desult: %w", err)
|
return fmt.Errorf("can't decode desult: %w", err)
|
||||||
}
|
}
|
||||||
@@ -54,20 +53,27 @@ func (l *StreamLoader) Decode() error {
|
|||||||
// Next loads next documents but doesn't perform decoding
|
// Next loads next documents but doesn't perform decoding
|
||||||
func (l *StreamLoader) Next() error {
|
func (l *StreamLoader) Next() error {
|
||||||
|
|
||||||
hasNext := l.Cursor.Next(l.ctx)
|
hasNext := l.cur.Next(l.ctx)
|
||||||
|
|
||||||
if l.Cursor.Err() != nil {
|
if l.cur.Err() != nil {
|
||||||
return l.Cursor.Err()
|
return l.cur.Err()
|
||||||
}
|
}
|
||||||
if !hasNext {
|
if !hasNext {
|
||||||
return mongo.ErrNoDocuments
|
return mongox.ErrNoDocuments
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (l *StreamLoader) Cursor() *mongox.Cursor {
|
||||||
|
return l.cur
|
||||||
|
}
|
||||||
|
|
||||||
// Close cursor
|
// Close cursor
|
||||||
func (l *StreamLoader) Close() error {
|
func (l *StreamLoader) Close() error {
|
||||||
|
return l.cur.Close(l.ctx)
|
||||||
return l.Cursor.Close(l.ctx)
|
}
|
||||||
|
|
||||||
|
func (l *StreamLoader) Err() error {
|
||||||
|
return l.cur.Err()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package mongox
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reexported mongo errors
|
||||||
|
var (
|
||||||
|
ErrMissingResumeToken = mongo.ErrMissingResumeToken
|
||||||
|
ErrNilCursor = mongo.ErrNilCursor
|
||||||
|
ErrUnacknowledgedWrite = mongo.ErrUnacknowledgedWrite
|
||||||
|
ErrClientDisconnected = mongo.ErrClientDisconnected
|
||||||
|
ErrNilDocument = mongo.ErrNilDocument
|
||||||
|
ErrEmptySlice = mongo.ErrEmptySlice
|
||||||
|
ErrInvalidIndexValue = mongo.ErrInvalidIndexValue
|
||||||
|
ErrNonStringIndexName = mongo.ErrNonStringIndexName
|
||||||
|
ErrMultipleIndexDrop = mongo.ErrMultipleIndexDrop
|
||||||
|
ErrWrongClient = mongo.ErrWrongClient
|
||||||
|
ErrNoDocuments = mongo.ErrNoDocuments
|
||||||
|
)
|
||||||
+10
-2
@@ -7,13 +7,20 @@ import (
|
|||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Reexport basic mongo structs
|
||||||
|
type (
|
||||||
|
Cursor = mongo.Cursor
|
||||||
|
Client = mongo.Client
|
||||||
|
Collection = mongo.Collection
|
||||||
|
)
|
||||||
|
|
||||||
// Database is the mongox database interface
|
// Database is the mongox database interface
|
||||||
type Database interface {
|
type Database interface {
|
||||||
Client() *mongo.Client
|
Client() *Client
|
||||||
Context() context.Context
|
Context() context.Context
|
||||||
Name() string
|
Name() string
|
||||||
New(ctx context.Context) Database
|
New(ctx context.Context) Database
|
||||||
GetCollectionOf(document interface{}) *mongo.Collection
|
GetCollectionOf(document interface{}) *Collection
|
||||||
Count(target interface{}, filters ...interface{}) (int64, error)
|
Count(target interface{}, filters ...interface{}) (int64, error)
|
||||||
DeleteArray(target interface{}) error
|
DeleteArray(target interface{}) error
|
||||||
DeleteOne(target interface{}, filters ...interface{}) error
|
DeleteOne(target interface{}, filters ...interface{}) error
|
||||||
@@ -25,6 +32,7 @@ type Database interface {
|
|||||||
|
|
||||||
// StreamLoader is a interface to control database cursor
|
// StreamLoader is a interface to control database cursor
|
||||||
type StreamLoader interface {
|
type StreamLoader interface {
|
||||||
|
Cursor() *Cursor
|
||||||
DecodeNext() error
|
DecodeNext() error
|
||||||
Decode() error
|
Decode() error
|
||||||
Next() error
|
Next() error
|
||||||
|
|||||||
Reference in New Issue
Block a user