Совместное использование проектов библиотеки с открытым исходным кодом Go Mongox: лучшие практики для упрощения разработки MongoDB
Совместное использование проектов библиотеки с открытым исходным кодом Go Mongox: лучшие практики для упрощения разработки MongoDB

статья:Пожалуйста, тестировщики, сообщите об этом, если обнаружите ошибку. Комментарий: Эта статья ориентирована на практичность и ясность. С точки зрения разработки она предоставляет тестировщикам подробные рекомендации по стандартизации сообщений об ошибках. Она направлена ​​на снижение затрат на связь и повышение эффективности. Это практическое руководство для решения практических задач.

Предисловие

в использовании Go языковая манипуляция MongoDB час,Go Предпочтительные библиотеки разработчиков обычно создаются MongoDB Запущено официальной командой mongo-go-driver。Эта библиотекада Предназначен для Go Создано разработчиками языка для поддержки MongoDB основные функции и с последней версией MongoDB совместимый. проходить mongo-go-driver,Go Разработчики могут легко подключаться к базе данных и выполнять операции запроса, вставки, обновления и удаления коллекций.

хотя mongo-go-driver Эта функция мощная, но за счет дальнейшей инкапсуляции эффективность разработки может быть значительно повышена в реальной разработке, особенно за счет уменьшения избыточности кода и улучшения читаемости в сложных сценариях. После инкапсуляции можно эффективно решить следующие распространенные проблемы:

  • Громоздкая запись данных BSON.:Строить Условия запроса、возобновлятьдокументилиполимеризациятрубопроводчас,Часто приходится писать большое количество BSON структура данных. простой формат BSON Данные легче записывать,Но в условиях сложной и многослойной вложенностидокументчас,Отнимает не только время,Также легко совершать ошибки. Даже небольшая оплошность,Это также может привести к отклонению результатов от ожиданий.,Увеличить уменьшает сложность отладки.
  • Дублирующийся код десериализации:Разные в запросесобиратьизданныечас,Часто приходится писать Дублирующийся код десериализации,Мало того, что Увеличить имеет избыточность кода,Это также увеличивает затраты на техническое обслуживание.
  • полимеризациятрубопроводдействовать Недостаточно дружелюбный:в ходе выполненияполимеризациядействоватьчас,недостающая параполимеризациятрубопроводиз Интуитивныйподдерживать。Разработчикам придется писать это вручнуюсложныйиз BSON Документация для определения различных этапов конвейера усложняет процесс.

Поэтому я разработал go mongox Библиотека оптимизирована для этих сценариев с использованием Go Общие функции языка связывают структуры и вводят модульность. CreatorUpdaterDeleterFinder и Aggregator и другие функции,Упростить вставку, возобновить, удалить, запрос иполимеризациядействовать соответственно. также,go mongox Также предоставляется инструмент «Строить» для запросов и заявлений о возобновлении полимеризации.,к Уменьшить избыточность кода,Повышение эффективности разработки,Помогите разработчикам больше сосредоточиться на бизнеселогикареализация。

В этой статье будет подробно проанализирован go mongox Идеи дизайна и практический опыт библиотек с открытым исходным кодом.

Вы готовы? Возьмите чашку любимого кофе или чая и узнайте, прочитав эту статью.

Адрес склада:https://github.com/chenmingyong0423/go-mongox чиновникдокумент:https://go-mongox.dev

введение в Go Mongox

go mongox это библиотека на основе дженериков, которая расширяет MongoDB официальные рамки. Посредством общей технологии он реализует структуру и MongoDB собиратьобязательность,направлена ​​на предоставлениебезопасность типаиупрощенные данныедействовать。go mongox Также представлена ​​цепная звонок, делает работу документа более плавной и обеспечивает богатые BSON Строить ивстроенный функционал, упрощенный BSON Построение данных。также,Он также имеет различные функции крючка.,Обеспечьте гибкость для пользовательской логики до и после работы базы данных.,Улучшенная масштабируемость и удобство обслуживания приложений.

Функции

  • Общий MongoDB собирать
  • Документальный фильм CRUD действовать
  • полимеризациядействовать
  • Встроенный базовый Model Структура,автоматизациявозобновитьпо умолчанию field Поле
  • поддерживать BSON Построение данных
  • поддерживать Структура tag проверять
  • встроенный Hooks
  • поддерживатьпрограммирование плагинов

Общая коллекция

Чтобы совместить конструкцию с MongoDB изсобирать Связывать,mongox определяет общий Collection Структура. через общие параметры T any,это обеспечиваетбезопасность типаиз MongoDB установить операции с сохранением оригинала *mongo.Collection посещать.

Язык кода:go
копировать
type Collection[T any] struct {
	collection *mongo.Collection
}

func (c *Collection[T]) Collection() *mongo.Collection {
	return c.collection
}

func NewCollection[T any](collection *mongo.Collection) *Collection[T] {
	return &Collection[T]{collection: collection}
}

Конструктивные особенности и преимущества

  • безопасность типа
    • проходить Дженерики,Collection[T] Может напрямую работать с различными типами моделей данных. T,Избегает утверждений и преобразований типов в традиционных методах.,Улучшена безопасность и читаемость кода.
  • возможность повторного использования кода
    • Дженерикиподдерживать Очень универсальныйизлогика Инкапсуляция,делать CRUD Этот метод необходимо реализовать только один раз, чтобы адаптироваться ко всем типам моделей данных. Возможность повторного использования значительно снижает затраты на разработку и обслуживание.
  • совместимость
    • Collection() метод позволяет пользователям напрямую получить доступ к базовому *mongo.Collection,Оригинальная функциональность сохранена,совместимыйсложныйиз MongoDB действоватьнуждаться。

CRUD-оператор

mongox встроенныйпять независимыхиз Оператортип:FinderCreatorUpdaterDeleter и Aggregator,Ответственность за каждогособиратьиз Находитьсоздаватьвозобновлятьудалить и полимеризация действовать. Эти экземпляры операторов передаются Collection[T] Предоставляются объекты, и каждый оператор фокусируется на определенной операции сбора.

Язык кода:go
копировать
func (c *Collection[T]) Finder() *finder.Finder[T] {
	return finder.NewFinder[T](c.collection)
}

func (c *Collection[T]) Creator() *creator.Creator[T] {
	return creator.NewCreator[T](c.collection)
}

func (c *Collection[T]) Updater() *updater.Updater[T] {
	return updater.NewUpdater[T](c.collection)
}

func (c *Collection[T]) Deleter() *deleter.Deleter[T] {
	return deleter.NewDeleter[T](c.collection)
}
func (c *Collection[T]) Aggregator() *aggregator.Aggregator[T] {
	return aggregator.NewAggregator[T](c.collection)
}
Язык кода:go
копировать
// Опустить подробный код

type Finder[T any] struct {}

type Creator[T any] struct {}

type Updater[T any] struct {}

type Deleter[T any] struct {}

type Aggregator[T any] struct {}

Конструктивные особенности и преимущества:

  • единая ответственность
    • Каждый Оператор фокусируется на конкретном сборе действующего действия в соответствии с единой ответственностьв принципе(SRP)。проходить Различные подразделенияиз Оператормодуль,Уменьшает связь между функциями.
  • Сильная масштабируемость
    • каждый Операторреализовывать свою функцию самостоятельнологика,Легко расширить. Например: Если вам нужно добавить функцию пакетного возобновления,Просто продлите Updater тип функции. Новые функциональные модули не повлияют на стабильность других модулей.
  • цепной звонокподдерживать
    • Операторподдерживатьцепной звонок,Легко комбинировать, сложно собиратьдействовать,Сделайте код сбора действующего действия более простым для написания.

Пример использования

  • Finder
Язык кода:go
копировать
user, err := userColl.Finder().
    Filter(query.Id("60e96214a21b1b0001c3d69e")).
    FindOne(context.Background())
  • Creator
Язык кода:go
копировать
insertOneResult, err := userColl.Creator().
    InsertOne(context.Background(), &User{Name: "Mingyong Chen", Age: 18})
  • Updater
Язык кода:go
копировать
updateResult, err := userColl.Updater().
		Filter(query.Id("60e96214a21b1b0001c3d69e")).
		Updates(update.Set("name", "Mingyong Chen")).
		UpdateOne(context.Background())
  • Deleter
Язык кода:go
копировать
deleteResult, err := userColl.Deleter().
    Filter(query.Id("60e96214a21b1b0001c3d69e")).
    DeleteOne(context.Background())
  • Aggregator
Язык кода:go
копировать
// Игнорировать возраст, искать только по имени
users, err := userColl.Aggregator().
    Pipeline(aggregation.NewStageBuilder().Project(bsonx.M("age", 0)).Build()).
    Aggregate(context.Background())

цепной звонок

в дизайнеподдерживатьцепной При звонке Оператор Структура необходимо уточнить обязанности Структура и параметры, которые необходимо передать. Операторподдержкицепной Суть звонка Пошаговое выстраивание параметров, необходимых для работы,Наконец, когда вызывается метод выполнения, параметры передаются полностью и выполняется операция.

к Updater Например, он фокусируется на возобновлять в этой сцене действовать цепной Цель звонка — непрерывный вызов методов для постепенного выполнения следующих задач:

  • Установить условия запросаfilter):Укажите потребностивозобновлятьиздокументобъем。
  • Определение возобновления контентаupdates):Объясните, как изменить Документальный фильм Поле。
  • осуществлятьвозобновлятьдействовать:Воля Строитьхорошийизпараметр应用приезжатьданные库извозобновлятьв методе。

к Внизда Updater Реализация:

Язык кода:go
копировать
type Updater[T any] struct {
	collection  *mongo.Collection
	filter      any
	updates     any
}

func (u *Updater[T]) Filter(filter any) *Updater[T] {
	u.filter = filter
	return u
}

func (u *Updater[T]) Updates(updates any) *Updater[T] {
	u.updates = updates
	return u
}

func (u *Updater[T]) UpdateOne(ctx context.Context, opts ...options.Lister[options.UpdateOptions]) (*mongo.UpdateResult, error) {
  // Игнорировать подробный код
}

func (u *Updater[T]) UpdateMany(ctx context.Context, opts ...options.Lister[options.UpdateOptions]) (*mongo.UpdateResult, error) {
  // Игнорировать подробный код
}

func (u *Updater[T]) Upsert(ctx context.Context, opts ...options.Lister[options.UpdateOptions]) (*mongo.UpdateResult, error) {
  // Игнорировать подробный код
}

Конструктивные особенности и преимущества

  • Простая и понятная конструкция параметров
    • Каждый связанный метод отвечает за создание одного параметра операции (например, Filter Строить Условия запроса,Updates Строитьвозобновлятьсодержание),проведениецепного звонка поэтапная подготовка параметров для сложного действия,Использование упрощенного метода.
  • Интуитивный метод вызова
    • цепной звонокизкодлогика Близкое к выражению естественного языка。Например:
Язык кода:go
копировать
updateResult, err := userColl.Updater().
		Filter(query.Id("60e96214a21b1b0001c3d69e")).
		Updates(update.Set("name", "Mingyong Chen")).
		UpdateOne(context.Background())
  • Высокая масштабируемость и согласованность
    • Цепные методы имеют единый стиль дизайна.,При добавлении новой функциональности просто расширяйте существующие связанные методы.,Нет необходимости менять базовую реализацию. Например,Может быть легко Updater Увеличивать Hook или функция журнала.

Для других операторов, таких как Creator и Finder и т. д., концепция дизайна также аналогична.

Сборка BSON

mongox Библиотека предоставляет мощные BSON Функция построения данных помогает разработчикам упростить и MongoDB Комплекс при общении BSON Построение данных。для Решение типичных проблем в разработкеиз Строить Сложный запрос、возобновлятьсодержаниекиполимеризациятрубопроводчасизутомительные вопросы,mongox Разделите функции на следующие категории:

  • query Сумка
    • Предназначен для построения условий запроса. BSON данные.
    • Предоставляет ряд связанных функций Строить и,поддерживать Условное сращивание($and$or)、объем Запрос($gt$lt)ждать Сложный запрос。
  • update модуль
    • Сосредоточьтесь на строительствевозобновлятьдействоватьиз BSON данные, например $set$inc ждать.
    • проходитьпрозрачныйиз Цепьдействовать,Помогите разработчикам быстро Строитьвозобновлять контент.
  • aggregation модуль
    • Сосредоточьтесь на строительстве MongoDB изполимеризациятрубопровод(pipeline)。
    • Предоставляет инструменты для поэтапного строительства сложного трубопровода полимеризации, поддержки. $match$group$project ждать.
  • bsonx модуль
    • Предоставляет ряд удобных функций и общих генераторов Строить для быстрого Строить различные BSON Данные, охватывающие общие потребности за пределами запросов, возобновляютполимеризацию.

пакет запроса

дляподдерживать Простой Строитьисложный Строить,query Сумка предлагает два режима Строить: Прямая. конструкция функцииистроитель строить。

Для поддержки простых операторов запроса и сложных операторов запроса для Строить,query Сумкапредоставил Два вида гибкостииз Строитьмодель:Прямая конструкция функции и строитель строить。этотдва путиизобъединяет контент из быстрых Строитьприезжатьсложныйлогика Выражатьиз Различныйнуждаться。

Прямая конструкция функции

Обработка предоставляет простые функции, которые разработчики могут быстро создать одним действием. BSON Условия запроса. Этот подход подходит для простых запросов, не требующих комбинационной логики.

Язык кода:go
копировать
func Eq(key string, value any) bson.D {
	return bson.D{bson.E{Key: key, Value: bson.D{{Key: "$eq", Value: value}}}}
}

func Lt(key string, value any) bson.D {
	return bson.D{bson.E{Key: key, Value: bson.D{{Key: "$lt", Value: value}}}}
}

// Игнорировать другие реализации функций

Пример использования:

Язык кода:go
копировать
// {
//   "name": "Чен Минён"	
// }
eq := query.Eq("name", "Чен Минён")

строитель строить

для Сложный запрослогикаиз Строить,mongox Обеспечивает мощный Builder Строитьустройство,проходитьцепной звонок путь шаг за шагом Строить комплекс BSON данные.

Язык кода:go
копировать
func NewBuilder() *Builder {
	query := &Builder{
		data: bson.D{},
		err:  make([]error, 0),
	}
	query.comparisonQueryBuilder = comparisonQueryBuilder{parent: query}
	query.logicalQueryBuilder = logicalQueryBuilder{parent: query}
	query.elementQueryBuilder = elementQueryBuilder{parent: query}
	query.arrayQueryBuilder = arrayQueryBuilder{parent: query}
	query.evaluationQueryBuilder = evaluationQueryBuilder{parent: query}
	query.projectionQueryBuilder = projectionQueryBuilder{parent: query}
	return query
}

type Builder struct {
	data bson.D
	comparisonQueryBuilder
	logicalQueryBuilder
	elementQueryBuilder
	arrayQueryBuilder
	evaluationQueryBuilder
	projectionQueryBuilder
}

func (b *Builder) Build() bson.D {
	return b.data
}

По своей сути построители создаются с помощью построителей комбинаторов, таких как comparisonQueryBuilder)Реализация другаядействоватьсимволизлогика。каждыйребенок Строитьустройствопредоставить свой эксклюзивныйиз Цепь方法,Builder Полный набор функций формируется путем объединения этих методов.

Реализация суббилдера (пример)

Язык кода:go
копировать
type comparisonQueryBuilder struct {
	parent *Builder
}

func (b *comparisonQueryBuilder) Eq(key string, value any) *Builder {
	e := bson.E{Key: EqOp, Value: value}
	if !b.parent.tryMergeValue(key, e) {
		b.parent.data = append(b.parent.data, bson.E{Key: key, Value: bson.D{e}})
	}
	return b.parent
}

func (b *comparisonQueryBuilder) Gt(key string, value any) *Builder {
	e := bson.E{Key: GtOp, Value: value}
	if !b.parent.tryMergeValue(key, e) {
		b.parent.data = append(b.parent.data, bson.E{Key: key, Value: bson.D{e}})
	}
	return b.parent
}

func (b *comparisonQueryBuilder) Lt(key string, value any) *Builder {
	e := bson.E{Key: LtOp, Value: value}
	if !b.parent.tryMergeValue(key, e) {
		b.parent.data = append(b.parent.data, bson.E{Key: key, Value: bson.D{e}})
	}
	return b.parent
}

Основная функция строителя:

  • цепной звонок: Разработчики могут звонить постоянно Builder Предоставляет методы для пошагового построения условий запроса.
  • сложныйлогикауправлять:другойиз Запрослогика(Например, сравнение、логика、множестводействовать)Юко Строитьустройство Самостоятельная реализация,Функциональная путаница исключена.

Пример использования:

Язык кода:go
копировать
//	{
//		"age": {
//			"$gt": {
//				"$numberInt": "18"
//			},
//			"$lt": {
//				"$numberInt": "30"
//			}
//		}
//	}
query.NewBuilder().Gt("age", 18).Lt("age", 30).Build()

Похоже на: query Сумка,mongox другие модули в (например. updateaggregationbsonx)Также принят аналогичныйиздизайнмодель,предоставил Прямая конструкция функцииистроитель построить два пути,поддерживатьцепной звоноккупрощатьсложныйлогикаиз Строить。ловить Вниз Я не буду их здесь представлять.。


Конструктивные особенности и преимущества

  • гибкость:
    • Доступны два режима Строить,Удовлетворить соответственно Простойсценаисложныйлогикасцена。
    • Прямая конструкция Режим «Функции» подходит для быстрой разработки, а режим «Строить» — для сложных нужд.
  • Разделение обязанностей:
    • Различные типы запросов действуют (например, сравнение、логика、множество)независимостьюизребенок Строитьустройство Ответственный за реализацию,Структура кода понятна,Легко расширить.
  • цепной звонок:
    • Строитьустройствоподдерживатьцепной звонок,пользователь Можеткинтуитивнопроходить Цепочка методов шаг за шагом Строить Условия запроса,Четкая семантика,Код работает естественно.
  • Повторное использование и масштабируемость:
    • Чтобы добавить новый символ действия, просто разверните соответствующий подраздел «Строить».,без изменения ядралогика。
    • Различные субпостроители могут поддерживаться независимо, что снижает связанность кода.

программирование плагинов

mongox поддерживатьпрограммирование плагинов,Он обеспечивает гибкий способ вставки пользовательской логики до и после работы базы данных.,Тем самым повышается масштабируемость и удобство обслуживания приложения. Очень подходит для следующих сценариев:

  • ПолеPadding по умолчанию: дополнение _id Поле значения исписывать время и возобновлять время.
  • Ведение журнала: запись информации до и после срабатывания.
  • Проверка данных: проверьте достоверность данных перед вставкой или возобновлением.
  • Проверка разрешений: проверка разрешений пользователя перед тем, как действовать в соответствии с потребностями бизнеса.

Базовый дизайн: структура обратного вызова

Callback да mongox программирование Ядро плагинов. Он содержит ряд свойств перехватчика (таких как beforeInsertafterInsert и т. д.) Привязывайте пользовательскую логику к конкретным этапам операций сбора.

Язык кода:go
копировать
// Глобальный менеджер обратного звонка
var Callbacks = initializeCallbacks()

// инициализация Callback
func initializeCallbacks() *Callback {
	return &Callback{
		beforeInsert: make([]callbackHandler, 0),
		afterInsert:  make([]callbackHandler, 0),
		beforeUpdate: make([]callbackHandler, 0),
		afterUpdate:  make([]callbackHandler, 0),
		beforeDelete: make([]callbackHandler, 0),
		afterDelete:  make([]callbackHandler, 0),
		beforeUpsert: make([]callbackHandler, 0),
		afterUpsert:  make([]callbackHandler, 0),
		beforeFind:   make([]callbackHandler, 0),
		afterFind:    make([]callbackHandler, 0),
	}
}

type Callback struct {
	beforeInsert []callbackHandler
	afterInsert  []callbackHandler
	beforeUpdate []callbackHandler
	afterUpdate  []callbackHandler
	beforeDelete []callbackHandler
	afterDelete  []callbackHandler
	beforeUpsert []callbackHandler
	afterUpsert  []callbackHandler
	beforeFind   []callbackHandler
	afterFind    []callbackHandler
}

type callbackHandler struct {
	name string
	fn   CbFn
}

type CbFn func(ctx context.Context, opCtx *operation.OpContext, opts ...any) error

// operation_type.go
type OpContext struct {
	Col *mongo.Collection `opt:"-"`
	Doc any
	// filter also can be used as query
	Filter       any
	Updates      any
	Replacement  any
	MongoOptions any
	ModelHook    any
}

func (c *Callback) Execute(ctx context.Context, opCtx *operation.OpContext, opType operation.OpType, opts ...any) error {
	switch opType {
	  // Игнорировать детали реализации в соответствии с типом действия. opType Выполните соответствующую функцию обратного вызова.
	}
	return nil
}
  • 钩ребеноктип:
    • Есть before и after Два вида крючков.
    • крючок для хранения форм срезов,Поддержка Регистрация нескольких функций обратного вызова,Эти функции будут выполняться последовательно.
  • callbackHandler
    • Сумка Содержит два атрибута:
      • name:钩ребенок函数изимя,Легко управлять и отлаживать.
      • fn:специфическийизфункция обратного вызова,Реализация настройкилогика。
  • CbFn функция обратного вызова:
    • Определяет унифицированную сигнатуру функции,параметр Сумкавключать:
      • ctx:начальство Внизискусство,Используется для управления жизненным циклом обратных вызовов.
      • opCtx:действоватьначальство Внизискусство,Сумка содержит параметры, связанные с работой базы данных.
      • opts:Можетвыбиратьпараметр,Используется для передачи дополнительной информации.
  • перезвонитьосуществлятьлогика
    • проходить Execute Метод в соответствии с типом операции Находить соответствующий список крючков и в порядке Выполнить обратный вызов。
    • Если какая-либо функция обратного вызова возвращает ошибку, выполнение прерывается и возвращается сообщение об ошибке.

Операционный контекст: OpContext

OpContext дафункция обратного вызоваизосновнойпараметр,Предоставляет подробную информацию о сборедействующих данных.,Чтобы разработчики могли гибко использовать функции обратного вызова.

Язык кода:go
копировать
type OpContext struct {
	Col *mongo.Collection `opt:"-"`  // MongoDB собирать Пример
	Doc any                          // документ
	Filter       any                 // Условия запроса
	Updates      any                 // возобновлятьсодержание
	Replacement  any                 // Заменить контент
	MongoOptions any                 // MongoDB Нативные варианты
	ModelHook    any                 // Используется для определения того, реализована ли привязка Структурада. Model Hook
}

Описание основного поля:

  • Col:текущийдействоватьизсобирать Пример。
  • Doc:документ。
  • Filter:действоватьиз Условия запроса,нравиться Находить、возобновлятьилиудалитьчасиспользовать。
  • Updates:возобновлятьсодержание。
  • Replacement:заменятьдействоватьиздокументсодержание。
  • MongoOptions:передача MongoDB Родной вариант активации.
  • ModelHook:и Связанные с модельюиз自定义начальство Внизискусство,Расширяемый для использования.

Пример использования

  • Зарегистрируйтесь для обратных вызовов с помощью удалить
Язык кода:go
копировать
// Зарегистрировать плагин
mongox.RegisterPlugin("after find", func(ctx context.Context, opCtx *operation.OpContext, opts ...any) error {
    if user, ok := opCtx.Doc.(*User); ok {
        fmt.Println(user)
    }
    if users, ok := opCtx.Doc.([]*User); ok {
        fmt.Println(users)
    }
    return nil
},operation.OpTypeAfterFind)

// удалитьплагин
mongox.RemovePlugin("after find", operation.OpTypeAfterFind)
  • Выполнить обратный вызов В актуальном собиратьдействовать, звоните Execute Метод к запускает зарегистрированный обратный вызов:
Язык кода:go
копировать
err = callback.GetCallback().Execute(ctx, globalOpContext, opType)
if err != nil {
	return
}

Конструктивные особенности и преимущества

  • гибкость: - Каждый тип действия поддерживает несколько before и after Разработчики могут свободно комбинировать и расширять хуки. Масштабируемость: - Обратные вызовы хранятся в виде срезов, что позволяет динамически удалять или заменять функции-перехватчики.
  • единство:
    • Функция обратного вызова использует единую подпись в сочетании с OpContext Предоставляет комплексный контекст действий для легкой отладки и расширения.
  • развязка:
    • собиратьдействоватьс бизнесомлогикаразделение,Механизм обратного вызова реализует непрофильные функции самостоятельно.,Сохраняйте код простым и удобным в сопровождении.

краткое содержание

В этой статье подробно рассказывается go mongox Открытый исходный Идеи дизайна и практический опыт библиотеки кодов охватывают несколько основных модулей Проектирование и реализация,Сумка Прилагаемое содержимое:

  • Collection[T] Проектирование и реализация:безопасность типаизсобирать Инкапсуляция;
  • CRUD Оператор(нравиться FinderCreatorUpdaterDeleterAggregator):модульизменятьиз增删改查дизайн;
  • цепной звонокреализация:упрощатьсложныйдействоватьиз流畅调用дизайн;
  • BSON Пакет построения данныхqueryupdateaggregate):Эффективный Строить Запрос、возобновлятьиполимеризация Связанныйиз BSON данные;
  • программирование плагиновиздизайн:проходить Крючковый механизм гибко расширяет функции.。

Хотя разработка функции, аналогичной go mongox из В библиотеке нетсложный,Но как тщательно спроектировать, чтобы добиться превосходной масштабируемости, простоты использования и возможности повторного использования?,Это вопрос, над которым разработчикам следует глубоко задуматься. Я надеюсь, что эта статья предоставит вам практические идеи и опыт.


Давайте присоединимся и внесем свой вклад, давайте go mongox Практичнее! Если присоединишься, иди mongox Станет Практичнее!


Привет, я да Чен Минён, разработчик, который любит технологии и готов ими делиться, а также да Открытый исходный любитель кодов.

Путь к успеху не переполнен. Вы заинтересованы в поиске партнера?

Следуйте за мной, добавляйте меня в друзья, учитесь и совершенствуйтесь вместе!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose