【发布时间】:2019-03-05 23:27:54
【问题描述】:
我在文档中有一个数组。
{
"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_2" 的数组元素,我使用 mongo 查询。
db.collection.find( { name: "name_1"},
{ _id: 0, additionalData: { $elemMatch: { "additionalDataName": "name_1_2" } }
})
如何使用mongoTemplate 做同样的事情?
我试过了
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);
我也尝试使用ArrayOperators.Filter.filter,我使用了这个答案。
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("name").is("name_1")),
Aggregation.project("additionalData").and(
ArrayOperators.Filter.filter("additionalData").as("item")
.by(ComparisonOperators.valueOf("item.additionalDataName").equalTo("name_1_2"))
)
);
mongoTemplate.aggregate(aggregation, "CustmObjects", Object.class);
https://stackoverflow.com/a/46769125/4587961
反正我得到的结果,数组的所有元素。 请帮忙!
【问题讨论】:
-
$elemMatch投影在aggregate()中不可用。请改用.find变体,或$filter,正如您链接到的答案所示。 -
我会在 9 小时内写完。现在不上班。它不适用于
Aggregate和ArrayOperators.Filter -
好的,最好实际展示您的尝试,以便我们可以指出您到底做错了什么。虽然我认为我之前确实将您链接到了
$filter用法的 spring-mongo 实现。所以有点不确定你没有做对哪一部分。要么那个,要么我链接了错误的例子:( -
@NeilLunn 我更新了。
标签: java mongodb spring-data-mongodb