Использование оператора $ in через Morphia - не так ли? - PullRequest
5 голосов
/ 25 мая 2011

У меня есть следующая сущность 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 встроен в Postcollection.

Что-то не так с моим запросом (должен ли я использовать что-то отличное от hasAnyOf), или это проблема с отображением отношений - я должен использовать вместо этого ObjectId?

Ответы [ 2 ]

6 голосов
/ 28 мая 2011

Я использую метод in () со списком или множеством, и он отлично работает.Вот фрагмент кода:

List<String> keywordList;
List<Product> products = Product.find().field("keywords").in(keywordList).asList();

Это должно работать для сбора вложенных файлов или ссылок.

3 голосов
/ 08 июня 2011

Вы должны использовать 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...