按日期过滤器数组期间的Morphia问题

时间:2015-01-03 13:49:51

标签: mongodb mongodb-java morphia

我有这些课程:

@Entity
public class Event implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private ObjectId id;

@Embedded
private List<Edition> editions;
...
}

public class Edition implements Serializable {

private static final long serialVersionUID = 1L;

private Date schedule;

...
}

我正在尝试搜索一个事件,并按照小于编制时间表的日期进行过滤。

例如,如果我有一个这样的集合:

{
  id : <ObjectID>,
  editions : [
    {schedule : 2014-1-1},
    {schedule : 2014-1-2}
  ]
}

如果我按2014-1-3搜索,我预计没有结果。

如果我按2014-1-1搜索,我期待的结果是:

{
  id : <ObjectID>,
  editions : [
    {schedule : 2014-1-2}
  ]
}

如果我在2013-12-31之前搜索我期望的结果:

{
  id : <ObjectID>,
  editions : [
    {schedule : 2014-1-1},
    {schedule : 2014-1-2}
  ]
}

我的问题出在最后一个案例中。

Query<Event> query = this.basicDAO.createQuery();
query = query.filter("editions.schedule >", <start date>);
return this.basicDAO.find(query).retrievedFields(true, "editions.$").asList();

当我尝试最后一个查询时,我只收到一个版本,但是,这两个匹配条款。有一些条款告诉我,我想要所有匹配的注册表,而不仅仅是第一个吗?

1 个答案:

答案 0 :(得分:1)

如文档中所述,projection operator仅查找匹配的第一个元素。

一般来说,您的文档结构是否真的最适合您的要求?具体来说,你需要嵌入Edition s? MongoDB将始终读取完整的Event文档(从RAM或磁盘中获取)。因此,如果您经常只提取Edition,嵌入可能是错误的方法。

如果需要嵌入,因为您经常需要完整的Event,我担心最简单的方法是获取完整的文档并在您的应用程序中放置正确的信息。这增加了一些网络和应用程序开销。