Использование оператора $ in через Morphia — делаешь это неправильно?

#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.105

2. Это регрессия и будет исправлено в версии 0.106: github.com/mongodb/morphia/issues/529