Использование составных ключей с 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