#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