Как написать Заменить операцию объединения и объединения объектов в данных Spring - PullRequest
0 голосов
/ 16 апреля 2019

Я написал собственный запрос 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());

Я не могу найти подходящие методы для замены корня, который принимает массив и выполнять слияние.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 16 апреля 2019

Если вы не хотите изменять имя поля «содержимое», вы можете использовать:

ReplaceRootOperation operation = replaceRoot().withValueOf(ObjectOperators.valueOf("$root").mergeWith("$content"));

В противном случае, не уверены, что это будет самое чистое решение, но вы можете создать его следующим образом:

Map<String, String> fieldMapping = new HashMap<>();
fieldMapping.put("content", "$content");
ReplaceRootOperation operation = replaceRoot().withValueOf(ObjectOperators.valueOf("$root").mergeWith(fieldMapping));
...