Использование операторов MongoDB $ arrayToObject и $ map в java весенней загрузке - PullRequest
1 голос
/ 08 мая 2020

У меня есть запрос в mongodb с фреймворком агрегации, который возвращает количество тем в моих документах. Это делается с помощью оператора $ group, и результат выглядит так:

{
postsByTopics: [
        {
            "_id" : "Topic 1",
            "count" : 3.0
        },
        {
            "_id" : "Topic 2",
            "count" : 1.0
        }
    ]
}

Я использую проекцию, чтобы получить более точные результаты

{
"$project": {
        "postsByTopics": {
            "$arrayToObject": {
                "$map": {
                    "input": "$postsByTopics",
                    "as": "el",
                    "in": {
                        "k": "$$el._id",
                        "v": "$$el.count",
                    }
                }
            }
        },

}

, который возвращает гораздо более красивый результат:

{
postsByTopics: {
    "Topic1" : 3.0,
    "Topic2" : 1.0
    }
}

Теперь я хотел бы превратить эту проекцию в код загрузки java spring. Я нашел project().and(ArrayOperators.ArrayToObject.arrayToObject("postsByTopics"))

и

project().and(VariableOperators.Map.itemsOf("postsByTopics").as("el")

, но я изо всех сил пытаюсь объединить их для достижения желаемого результата

1 Ответ

1 голос
/ 09 мая 2020

Синтаксис Spring-data для «сложного» запроса не подходит.

Обходной путь 1: Реализуйте AggregationExpression для метода .andApply.

ProjectionOperation project = Aggregation.project().and(
    ArrayOperators.ArrayToObject.arrayValueOfToObject(
      Map
       .itemsOf("postsByTopics")
       .as("el")
       .andApply(agg -> new Document("k", "$$el._id").append("v", "$$el.count"))
    )   
).as("postsByTopics");

Обходной путь 2: Реализовать AggregationOperation с MongoDB JSON синтаксис

Aggregation agg = Aggregation.newAggregation(
    exp -> new Document("$project", 
               new Document("postsByTopics", 
                   new Document("$arrayToObject",
                       new Document("$map", 
                           new Document("input", "$postsByTopics")
                               .append("as", "el")
                               .append("in", 
                                   new Document("k", "$$el._id")
                                        .append("v", "$$el.count")
                           )
                       )
                   )
               )
           )        
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...