Использование составных ключей с Salat и MongoDB

Я только что прочитал этот пост о том, как использовать составные ключи с Salat и MongoDB... и более или менее ясно, как это работает. Тем не менее, мне интересно, если @Key аннотация обязательна, даже если мой ключ уже назван id, Я пытаюсь сериализовать несколько классов дел из внешней библиотеки, и я бы предпочел не переопределять их. Даны следующие внешние классы дел:

case class UserId(id: String, mail: String)
case class User(id: UserId, name: String, surname: String)

Можно ли сериализовать User объект как этот (то есть без @Key аннотация)?

object UserDAO extends SalatDAO[User, UserId](...)

Благодарю.

1 ответ

Решение

MongoDB ожидает, что каждый документ в коллекции будет иметь поле id, называемое "_id". Если вы не предоставите поле "_id", mongo-java-driver создаст его для вас.

Итак, что вам нужно сделать, это либо:

  • назовите поле "_id", а не "id"
  • использование @Key аннотация, чтобы переназначить ваше поле "id" в "_id", когда User сериализуется
  • добавьте переназначение глобального ключа "id" в "_id", чтобы не было необходимости использовать @Key на месте

При работе с внешней моделью третий вариант является наиболее эффективным. См. Раздел "Переназначение глобального ключа" в этой статье вики: https://github.com/novus/salat/wiki/CustomContext

Как только вы сделали это переназначение, UserDAO должно хорошо работать с композитным ключом.

Помните, что даже если ваше поле называется "id" в User класс case, запросы должны ссылаться на _id потому что это то, что поле называется в вашем документе MongoDB.

Также помните, что когда вы используете составной ключ, вам нужно будет создать собственный индекс, который будет охватывать все поля составного ключа в том порядке, в котором вы собираетесь их запрашивать. Вы можете использовать Dex для анализа вашего журнала MongoDB и выработки рекомендаций: https://github.com/mongolab/dex

Другие вопросы по тегам