#mongodb #playframework #morphia
#mongodb #playframework #morphia
Вопрос:
У меня есть следующий объект Play Framework (использующий Morphia для сохранения) как часть общего приложения для ведения блогов:
@Entity
public class Comment extends Model {
...
@Reference
@Indexed
public SiteUser commenter;
public static List<Comment> getLastCommentsByUsers(final List<SiteUser> users) {
final Query<Comment> query ds().createQuery(Comment.class);
query.field(commenter).hasAnyOf(users);
return query.asList();
}
}
SiteUser:
@Entity(noClassnameStored=true)
public class SiteUser extends AbstractUser {
public String realName;
}
AbstractUser:
public class AbstractUser extends Model {
@Indexed(value= IndexDirection.DESC, unique = true)
public String emailAddress;
@Required
public String password;
}
Предполагается, что метод getLastCommentsByUsers()
возвращает все комментарии пользователей в users
параметре, но я всегда получаю пустой List
ответ. Причина, по которой Commment
создается отдельная коллекция, заключается в том, чтобы определенные пользователи могли извлекать последние X Comment
-ы из связанных с ними Post
-ов, что невозможно, если Comment
это встроено в Post
коллекцию.
Что-то не так с моим запросом (должен ли я использовать что-то другое, чем hasAnyOf
), или это проблема с отображением отношений — должен ли я использовать ObjectId
вместо этого?
Комментарии:
1. Пожалуйста, напишите, как выглядит ваш класс SiteUser.
Ответ №1:
Я использую метод in () со списком или набором, и он работает отлично. Вот фрагмент:
List<String> keywordList;
List<Product> products = Product.find().field("keywords").in(keywordList).asList();
Это должно сработать и для сбора встроенных ссылок or.
Ответ №2:
Вы должны использовать List<Key<SiteUser>>
для запроса:
public static List<Comment> getLastCommentsByUsers(final List<SiteUser> users) {
final Query<Comment> query ds().createQuery(Comment.class);
query.field(commenter).hasAnyOf(toKeys(users)); // convert to keys
return query.asList();
}
public static List<Key<SiteUser>> toKeys(List<SiteUser> users) {
List<Key<SiteUser>> keys = new ArrayList<Key<SiteUser>>();
for(SiteUser user: users) {
keys.add(ds().getMapper().getKey(user));
}
return keys;
}
Или вы можете просто получить ключи с помощью:
List<Key<SiteUser>> keys = ds().createQuery(SiteUser.class).query().filter(...).asKeyList();
Комментарии:
1. Это возвращает следующую ошибку:
java.lang.IllegalArgumentException: can't serialize class org.mongodb.morphia.Key
с Morphia v0.1052. Это регрессия и будет исправлено в версии 0.106: github.com/mongodb/morphia/issues/529