按日期过滤阵列期间的吗啡问题

Morphia problems during filter arrays by date

我有那些课程:

@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();

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

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

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

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