通过Morphia使用$ in运算符 - 做错了吗?

Ric*_*ich 5 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

SiteUser:

@Entity(noClassnameStored=true)
public class SiteUser extends AbstractUser {

    public String realName;

}
Run Code Online (Sandbox Code Playgroud)

AbstractUser:

public class AbstractUser extends Model {

    @Indexed(value= IndexDirection.DESC, unique = true)
    public String emailAddress;

    @Required
    public String password;
}
Run Code Online (Sandbox Code Playgroud)

该方法getLastCommentsByUsers()应该返回users参数中用户的所有注释,但我总是得到一个空的List.这Commment是一个单独的集合的原因是能够Comment通过其关联的Posts 检索某些用户的最后X ,如果Comment嵌入在Post集合中,这是不可能的.

我的查询是否有问题(我应该使用其他内容hasAnyOf),还是关系映射存在问题 - 我应该使用ObjectId吗?

Joe*_*non 6

我使用in()方法与列表或集合,它的工作完美.这是一个片段:

List<String> keywordList;
List<Product> products = Product.find().field("keywords").in(keywordList).asList();
Run Code Online (Sandbox Code Playgroud)

这也适用于嵌入式或引用的收集.


Fre*_*ind 3

您应该使用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;
}
Run Code Online (Sandbox Code Playgroud)

或者您可以通过以下方式获取密钥:

List<Key<SiteUser>> keys = ds().createQuery(SiteUser.class).query().filter(...).asKeyList();
Run Code Online (Sandbox Code Playgroud)