MongoDB+Morphia如何查询@Embedded List<T>对象的一部分数据
sugarforever
2012-08-02
@Entity
public class QuotationDocument { @Id private ObjectId id; private String code; private Boolean isIndex; @Embedded private List<QuotationEntry> entries; public QuotationDocument() { id = null; code = null; isIndex = null; } public QuotationDocument(String code, boolean isIndex, List<QuotationEntry> entries) { super(); this.code = code; this.isIndex = isIndex; this.entries = entries; } public QuotationDocument(String code, boolean isIndex) { this(code, isIndex, new ArrayList<QuotationEntry>()); } public void addQuotationEntry(QuotationEntry entry) { if (entries == null) entries = new ArrayList<QuotationEntry>(); entries.add(entry); } public ObjectId getId() { return id; } public void setId(ObjectId id) { this.id = id; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public boolean isIndex() { return isIndex; } public void setIndex(boolean isIndex) { this.isIndex = isIndex; } public List<QuotationEntry> getEntries() { return entries; } public void setEntries(List<QuotationEntry> entries) { this.entries = entries; } public List<QuotationEntry> findQuotationEntriesBy(String code, Date start, Date end) { List<QuotationEntry> qes = new ArrayList<QuotationEntry>(); if (this.entries == null) return qes; for (QuotationEntry e : this.entries) { if (e.getCode().equals(code)) { if (start != null && e.getTs().before(start)) continue; if (end != null && e.getTs().after(end)) continue; qes.add(e); } } return qes; } public Date findMaxTimestamp() { if (entries == null || entries.size() == 0) return null; Collections.sort(this.entries, new QuotationEntryDescComparator()); return this.entries.get(0).getTs(); } } @Embedded public class QuotationEntry { private String code; private Date ts; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public Date getTs() { return ts; } public void setTs(Date ts) { this.ts = ts; } } 大家看看,QuotationDocument里有个@Embedded private List<QuotationEntry> entries; 在QuotationDocument里我是这么实现查询最大的ts的 public Date findMaxTimestamp() { if (entries == null || entries.size() == 0) return null; Collections.sort(this.entries, new QuotationEntryDescComparator()); return this.entries.get(0).getTs(); } 刚开始弄MongoDB,没经验。像MySQL这些RDBMS中可以通过DAO中实现SQL查询获取某一列的最大值。我猜想MongoDB里应该也类似吧。应该可以在QuotationDocument的DAO里做这个事情吧?但不知道怎么做?请指教了。 否则,像现在这么实现,List<QuotationEntry>就全部都加载到内存里了,再去寻找最大的ts。这样的内存消耗明显太大。 |