这是我要搜索的文档。集合为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。 拜托,我需要更简单,更有效的东西。