Spring Mongo“elemMatch” - 获取结果中包含的其他字段以及指定的数组元素匹配

时间:2015-08-13 23:39:45

标签: java spring mongodb

我正在使用Spring + Jersey + Mongo开发Web应用程序。我正在使用spring mongo的elemMatch获得一些特定的结果。

这是我的类,它将与mongo查询的输出进行映射。

public class ABC {
    private String id;

    private String dId;

    private String lId;

    private String hId;

    private String pId;

    private List<GeneralData> generalRecords;

    private List<String> fhistory;

    private List<String> mhistory;

    private List<String> specialNotes;
}

public class GeneralData {
    private Object data;

    private HistoryFilter dataType;
}

现在,这就是我的数据在mongo中的样子:

{
    "_id" : ObjectId("55ccda7fe4b03cc159c2ce17"),
    "_class" : "com.dpdocter.collections.HistoryCollection",
    "dId" : "5525ef96e4b077dfc168369b",
    "lId" : "5525ef96e4b077dfc16836a1",
    "hId : "5525ef96e4b077dfc16836a0",
    "pId" : "55ccd9f1e4b03cc159c2ce0b",
    "generalRecords" : [ 
        {
            "data" : "55ccdde7e4b03cc159c2ce18",
            "dataType" : "REPORTS"
        }, 
        {
            "data" : "55ccda63e4b03cc159c2ce14",
            "dataType" : "CLINICAL_NOTES"
        }
    ]
}

我希望记录基于dId,lId,hId,pId和elemMatch on generalRecords的特定数据类型(比如REPORTS)。 而且,以下是我的标准代码。

Criteria matchCriteria = Criteria.where("dId").is(dId).and("lId").is(lId).and("hId").is(hId).and("pId").is(pId).and("generalRecords.dataType").is("REPORTS");
Criteria elementMatchCriteria = Criteria.where("generalRecords").elemMatch(Criteria.where("dataType").is("REPORTS"))

BasicQuery query = new BasicQuery(matchCriteria.getCriteriaObject(), elementMatchCriteria.getCriteriaObject());

ABC abc = mongoOperations.findOne(query, ABC.class);

上述结果

ABC [id=55ccda7fe4b03cc159c2ce17, dId=null, lId=null, hId=null, pId=null, generalRecords=[GeneralData [data=55ccdde7e4b03cc159c2ce18, dataType=REPORTS]], fhistory=null, mhistory=null, specialNotes=null]
generalpcords是完美的,并且是理想的,但我只想包括dId,lId,hId,pId,fHistory,mHistory和specialNotes。我已经尝试过了:

query.fields().include('fieldName')

另外,其他一些奇怪的查询组合,但没有任何帮助。 任何人都可以提出建议。

0 个答案:

没有答案