Как использовать MongoDB $ let в Spring Data MongoOperation - PullRequest
0 голосов
/ 07 марта 2020

MongoDB возвращает $count как массив из одного элемента. И я хочу преобразовать его в объект (int или String), чтобы я мог сопоставить его непосредственно с полем String в моем классе. Для этого я использовал проекцию ниже, которая превращает его в int32 объект. Теперь я хочу перевести приведенную ниже проекцию на Spring Data MongoOperation aggregate

{  
  $project:{
  "count": 
    {
      $let:{
        "vars":{
          "elem":
            { $arrayElemAt:["$count",0] }
        },
        "in":{
          "count" :"$$elem.totalVideos"
        }  
      }
    }
  }
}

. Чтение документации, которую я построил, частично, как показано ниже.

Let.define(Let.ExpressionVariable.newVariable("elem").
                    forExpression(ArrayOperators.ArrayElemAt.arrayOf("count").elementAt(0)))

Но не уверен, правильно ли я это делаю. Кто-нибудь знает, как это можно сделать в Spring Data?

Заранее спасибо

1 Ответ

0 голосов
/ 07 марта 2020

Хорошая реализация

Вместо "count" :"$$elem.totalVideos" мы применяем "count" : {"$toInt" : "$$elem.totalVideos"} Вы можете использовать ConvertOperators .ToString, ConvertOperators .ToLong, et c ...

Aggregation.project()
    .and(
        Let.define(Let.ExpressionVariable
            .newVariable("elem")
                .forExpression(
                    ArrayOperators.ArrayElemAt.arrayOf("count").elementAt(0)
                )
            ).andApply(PropertyExpression.property("count").definedAs(ToInt.toInt("$$elem.totalVideos")))
            //.andApply(ToInt.toInt("$$elem.totalVideos"))
    ).as("count")

Меньше Довольно реализация

Aggregation.project()
    .and(
        Let.define(Let.ExpressionVariable
            .newVariable("elem")
                .forExpression(
                    ArrayOperators.ArrayElemAt.arrayOf("count").elementAt(0)
                )
            ).andApply(new AggregationExpression() {
                @Override
                public Document toDocument(AggregationOperationContext context) {
                    return new Document("count", "$$elem.totalVideos");
                }
            })
    ).as("count")
...