«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как хранить рабочие процессы с узлами разных типов в MongoDB с помощью Mgo (Go)?

Как хранить рабочие процессы с узлами разных типов в MongoDB с помощью Mgo (Go)?

Опубликовано 9 ноября 2024 г.
Просматривать:274

How Can You Store Workflows with Diverse Node Types in MongoDB using Mgo (Go)?

Интерфейс как модель в Mgo (Go): устранение ошибки присваиваемости

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

Проблема назначения

Ошибка, возникшая во время операции поиска, связана с несовместимостью между декодированным документом и Интерфейс узла. В Mgo отсутствует информация о типе, необходимая для определения конкретного типа каждого встроенного узла. Это приводит к несоответствию присваиваний.

Альтернативный подход: внедрение информации о типе

Чтобы преодолеть это препятствие, рассмотрите возможность инкапсуляции информации о типе во встроенные узлы. Определите новую структуру NodeWithType, которая состоит из интерфейса Node и поля Type, представляющего определенный тип.

type NodeWithType struct {
   Node Node `bson:"-"`
   Type string
}

Пользовательская демаршалинг BSON

Чтобы устранить разрыв между декодированным документом и структурой Go, реализуйте функцию SetBSON для NodeWithType. Эта функция декодирует поле «Тип», создаст экземпляр соответствующего типа и делегирует ему демаршалинг.

func (nt *NodeWithType) SetBSON(r bson.Raw) error {
   // Decode Type field
   var typeName string
   err := bson.Unmarshal(r["Type"], &typeName)
   if err != nil {
      return err
   }

   // Create an instance of the correct type based on Type field
   var node Node
   switch typeName {
   case "EmailNode":
      node = &EmailNode{}
   case "TwitterNode":
      node = &TwitterNode{}
   }

   // Unmarshal the remaining fields into the created instance
   if err = node.SetBSON(r[typeName]); err != nil {
      return err
   }

   // Assign the created instance to the Node field
   nt.Node = node

   return nil
}

В структуре рабочего процесса замените фрагмент узла фрагментом NodeWithType.

type Workflow struct {
   CreatedAt time.Time
   StartedAt time.Time
   CreatedBy string
   Nodes []NodeWithType
}

Благодаря такому подходу Mgo теперь может успешно находить и демаршализировать рабочие процессы со встроенными узлами разных типов.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3