Ручная ссылка на DBRef в Spring Data MongoDB? - PullRequest
0 голосов
/ 10 мая 2019

Я все еще изучаю MongoDB и его драйверы, так что простите мое невежество.

Я понимаю, что Spring Data MongoDB может автоматически отображать что-то вроде этого:

{
  "_id" : ObjectId("5cd4e8140615c7480f549907"),
  "name" : "test",
  "otherCollection" : [ 
    {
      "$ref" : "otherCollection",
      "$id" : ObjectId("5cd4e8140615c7480f549905")
    }
  ]
}

Он заполняет мой POJOотлично, во вложенных коллекциях.Однако я также пытался ссылаться вручную, что-то вроде этого:

{
  "_id" : ObjectId("5cd4e8140615c7480f549906"),
  "name" : "test",
  "otherCollection" : [ 
    ObjectId("5cd4e8140615c7480f549905")
  ]
}

И это ошибка, которую я получил

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.bson.types.ObjectId] to type [com.test.test.model.OtherObject]

В документах для справочного руководства написано

Then your application can run a second query to return the related data.

Теперь я понимаю, что они буквально означают, что вы сами должны войти и объединить их в коде.Теперь для DBRef у них есть это

Some community supported drivers may have alternate behavior and may resolve a DBRef into a document automatically.

Мой вопрос: является ли причиной того, что многие драйверы (например, Spring Data MongoDB) разрешают DBRef для вас, потому что они ограничены одной коллекцией?И нет такого понятия, как автоматическое разрешение справочных справочников, потому что вместо этого им придется сканировать всю базу данных?

И, как следствие, мои модели содержат конечный набор отношений «многие ко многим», которые также имеютмного повторных данных, поэтому я не хочу вставлять.Изображение, если родитель-потомок в массиве объектов перевернут, нужен этот вариант использования.

Так что мой выбор будет

  1. Написать пользовательский преобразователь типов для ручных ссылок в Spring DataMongoDB (это даже вещь?)
  2. Использовать DBRef для всех элементов в коллекции
  3. Иметь отдельную таблицу отношений, которая связывает идентификаторы и запрашивает их с помощью $lookup (Как производительность сравнивается сDBRef?)
  4. Не используете MongoDB для множества вариантов использования «многие ко многим»?Может быть, это неправильный инструмент для этого, и я должен придерживаться баз данных RDBMS?

Заранее большое спасибо.

...