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。这样的内存消耗明显太大。
Global site tag (gtag.js) - Google Analytics