Представление продукта для хранения в пн go с использованием библиотеки ReactiveMon go - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь смоделировать продукт для моей коллекции "products" на mongodb.

Так это выглядит так:

{
  "_id": "abc123",  
  "sku": "sku123",
  "name": "some product name",
  "description": "this is a description",
  "specifications": {
    "name" : "name1",
    "metadata": [
      {"name1": "value1"},
      {"name2": "value2"},      
    ]
  }
}

Итак, мои классы дел выглядят так:

case class Product(
  id: String,
  sku: String,
  name: String,
  description: String,
  specifications: Specification
)

case class Specification(
  name: String,
  metadata: Metadata
)
case class Metadata( 
  kvp: Map[String, String]
)

Так что теперь мне нужно будет создать обработчики для каждого типа Product, Specification и Metadata, чтобы при чтении / записи данных в mon go он выполнял правильное сопоставление данных?

Как будет Я немного запутал карту класса метаданных?

1 Ответ

2 голосов
/ 17 апреля 2020

Как указано в документации , Reader / Writer можно просто генерировать большую часть времени.

import reactivemongo.api.bson._

// Add in Metadata companion object to be in default implicit scope
implicit val metadataHandler: BSONDocumentHandler[Metadata] = Macros.handler

// Add in Specification companion object to be in default implicit scope
implicit val specHandler: BSONDocumentHandler[Specification] = Macros.handler

// Add in Product companion object to be in default implicit scope
implicit val productHandler: BSONDocumentHandler[Product] = Macros.handler

Затем любая функция, использующая BSON Reader / Writer классы типов примут Product / Specification / Metadata:

BSON.writeDocument(Product(
  id = "X",
  sku = "Y",
  name = "Z",
  description = "...",
  specifications = Specification(
    name = "Lorem",
    metadata = Metadata(Map("foo" -> "bar"))))).foreach { doc: BSONDocument =>
  println(BSONDocument pretty doc)
}
/* {
  'id': 'X',
  'sku': 'Y',
  'name': 'Z',
  'description': '...',
  'specifications': {
    'name': 'Lorem',
    'metadata': {
      'kvp': {
        'foo': 'bar'
      }
    }
  }
} */
...