Mongo模板在文档内部列表中的find元素

时间:2019-03-05 12:37:08

标签: java mongodb spring-data-mongodb

这是我要搜索的文档。集合为CustmObjects。这是一个CustomObject

{
    "id" : "id_1",
    "name" : "name_1";
    "additionalData" : [
        {
             "additionalDataId" : "id_1_1",
             "additionalDataName" : "name_1_1",
             "longText" : "A long story about..."  
        },
        {
             "additionalDataId" : "id_1_2",
             "additionalDataName" : "name_1_2",
             "longText" : "A longer story about danger..."  
        },
        {
             "additionalDataId" : "id_1_3",
             "additionalDataName" : "name_1_3",
             "longText" : "A longer story about danger and courage"  
        },
    ]       
}

检索名称为 name_1 的文档很容易。

final nameToSearchBy = "name_1";

Query query = new Query();
Criteria criteria = Criteria.where("name").is(nameToSearchBy);
query.addCriteria(criteria);
mongoTemplate.findOne(query, CustomObject.class, "CUSTOM_OBJECTS_COLLECTION");

现在我的问题。如何检索名称为additionalData的{​​{1}}?我不需要检索整个文档,只需检索数组中的条目

当然,我可以检索整个文档并遍历Java程序中的"id_1_2"值。但是我想将此工作委托给数据库服务器。

我尝试了

additionalData

它返回数组的所有元素。我只需要一个匹配的元素。

更新

这就是我要做的 Retrieve only the queried element in an object array in MongoDB collection

Aggregation aggregation = Aggregation.newAggregation(
        Aggregation.match(Criteria.where("name").is("name_1").and("additionalData.additionalDataName").is("name_1_2")),
        Aggregation.project("additionalData"),
);
mongoTemplate.aggregate(aggregation, "CustmObjects", Object.class);

据我了解,第二部分是选择字段的投影。我需要数组元素中的所有字段。

db.find({shapes: {"$elemMatch": {name: "name_1_2"}}}, ... )

第二个链接 Spring data Match and Filter Nested Array

我想要得到的结果是这个

{"shapes.color": 1}

更复杂,它在array内部的element内部具有array。 拜托,我需要更简单,更有效的东西。

0 个答案:

没有答案