преобразование _id (ObjectId) в строку в агрегации для поиска Spring boot

#java #mongodb #spring-boot #mongodb-query #mongotemplate

#java #mongodb #spring-boot #mongodb-запрос #mongotemplate

Вопрос:

ЭТО НЕ ВОПРОС

У меня долгое время была проблема с преобразованием ObjectId в строку в агрегации spring boot, и я не могу найти никакого полезного способа ее решения. наконец, я выясняю, и мне нравится делиться своим способом с теми, у кого такая же проблема; Как вы знаете, для поиска нужны две стороны поиска с одинаковым значением, например, две стороны ObjectId или две стороны string если у вас есть objecteId и string на другой стороне, вы должны преобразовать этот ObjectId в stringа затем напишите свой этап поиска; этап перед поиском должен быть этапом проекта с использованием выражения $toString, подобного приведенному ниже:

 ProjectionOperation projectionOperation = Aggregation.project(/*your nedded fields */)
.and(ConvertOperators.ToString.toString("$_id)).as("aggId");
  

и затем вы можете легко использовать поиск, как показано ниже:

 Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(
                        Criteria.where("cratorId").is(userId)
                )
                ,
                projectionOperation
                ,
                Aggregation.lookup("post", "aggId", "courseId", "postList"),
  

моя полная агрегация:

 ProjectionOperation projectionOperation = Aggregation.project(/*your nedded fields */)
.and(ConvertOperators.ToString.toString("$_id")).as("aggId");

Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(
                        Criteria.where("creatorId").is(userId)
                )
                ,
                projectionOperation
                ,
                Aggregation.lookup("post", "aggId", "courseId", "postList")
);

return this.aggregate(agg, entityClass, Object.class).getMappedResults();
  

надеюсь, это может быть полезно

Ответ №1:

Я также искал ответ на этот вопрос и нашел это решение.

Я использую spring-data-mongodb:3.0.0.RELESE .

В вашем конвейере агрегации

 AddFieldsOperation.builder().addField("strId")
                    .withValue(
                        ConvertOperators.ToString.toString("$_id")
                    ).build()
  

Это эквивалентно

 {
    $addFields: {
        strId: {$toString: "$_id"}
    }
}
  

Вы можете заменить strId любым именем, которое хотите, и использовать его в следующей операции.

Ответ №2:

 List<Map> getMultiTable(){
    ProjectionOperation projectionOperation = Aggregation.project(/*your nedded fields */)
            .and(ConvertOperators.ToString.toString("$_id")).as("_id")
            .and(ConvertOperators.ToObjectId.toObjectId("$userId")).as("userId");

    Aggregation agg = Aggregation.newAggregation(
            Aggregation.match(
                    Criteria.where("status").is(0)
            ),
            projectionOperation,
            Aggregation.lookup("videoComment", "_id", "videoId", "commentList"),
            Aggregation.lookup("user", "userId", "_id", "userList")
    );

    List<Map> result = mongoTemplate.aggregate(agg, "mediaFile", Map.class).getMappedResults();
    System.out.println(result);
    return resu<
}
  

Комментарии:

1. три таблицы с двумя разными преобразователями для полей разных стилей: 1. ObjectId в строку; 2. ToObjectId.toObjectId