Я написал собственный запрос MongoDB, который работает как положено.Я пытаюсь написать свой Spring-эквивалентный запрос, но не могу это сделать.По сути, я хотел отфильтровать массив полей на основе заголовков, представленных во входном массиве.Вот пример документа:
{
"domain":"diageotest.com",
"locale":"en-gb",
"pageName":"Content_1",
"contents":[
{
"contentName":"Template_1",
"fields":[
{
"id":"firstname",
"fieldType":"Plain Text",
"title":"First Name",
"value":"Pawan"
},
{
"id":"lastname",
"fieldType":"Plain Text",
"title":"Last Name",
"value":"Kumar"
}
]
}
],
"createdBy":"ag-KumarJog",
"createdDate":"Jan 23,2019",
"isDefaultLocale":true,
"modifiedBy":"ag-KumarJog",
"modifiedDate":"Jan 23,2019",
"version":1
}
А ниже мой собственный запрос:
db.contents.aggregate([
{$match: { $and: [
{"domain": "diageotest.com"},
{"locale": {$in: ["en-in", "en-us"]}},
{"contents.contentName": "Template_1"}
]
}
},
{$unwind: "$contents"},
{$unwind: "$contents.fields"},
{$match: { "contents.fields.title": {$in: ["First Name"]}}},
{$group: { "_id": "$_id",
"contents": { "$push": "$contents"},
"root": {$first:"$$ROOT"} }},
{$replaceRoot:{newRoot:{$mergeObjects:["$root",{contents:'$contents'}]}}},
{$skip : 0},
{$limit : 5}
]);
Здесь, в приведенном выше запросе, если я передам «Имя» в массиве ($ в условии), то выходной JSON будет содержать только то поле с заголовком «Имя».
В Java, я пытался ниже, но застрял при замене корня:
MatchOperation matchOperation = this.matchByTemplateDomainAndLocales(domainName, templateName,
requestBody.getLocales());
// ---------------------------------------------------//
UnwindOperation unwindContents = unwind("$contents");
UnwindOperation unwindFields = unwind("$contents.fields");
MatchOperation matchFields = match(where("contents.fields.title").in(requestBody.getFields()));
GroupOperation groupOperation = group("id").push("$contents").as("contents").first("$$ROOT").as("root");
//ReplaceRootOperation replaceRootOperation = builder().withDocument()
// ---------------------------------------------------//
SortOperation sortOperation = sort(sort);
LimitOperation limitOperation = limit(requestBody.getLimit());
SkipOperation skipOperation = skip(requestBody.getSkip().longValue());
Я не могу найти подходящие методы для замены корня, который принимает массив и выполнять слияние.Пожалуйста, помогите.