通过Morphia使用$in运算符-操作错误



我有以下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();
    }
}

站点用户:

@Entity(noClassnameStored=true)
public class SiteUser extends AbstractUser {
    public String realName;
}

抽象用户:

public class AbstractUser extends Model {
    @Indexed(value= IndexDirection.DESC, unique = true)
    public String emailAddress;
    @Required
    public String password;
}

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

我的查询有什么问题吗(我应该使用hasAnyOf以外的东西吗),还是关系映射有问题?我应该改用ObjectId吗?

我将in()方法与列表或集合一起使用,并且它可以完美地工作。这里有一个片段:

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

这也适用于嵌入式或引用的集合。

您应该使用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();

相关内容

最新更新