mongo의 그룹 집계 후 _id 필드의 이름을 변경할 수 있습니까?
다음과 같은 질문이 있습니다(간체).
db.collection.aggregate([
{ $match: { main_id: ObjectId("58f0f67f50c6af16709fd2c7") } },
{
$group: {
_id: "$name",
count: { $sum: 1 },
sum: { $sum: { $add: ["$P31", "$P32"] } }
}
}
])
Java에서 이 쿼리를 수행하고 클래스에 매핑하고 싶지만 원하지 않습니다._id
지도에 표시될name
내가 이런 짓을 하면,
@JsonProperty("_id")
private String name;
그런 다음 이 데이터를 mongo에 다시 저장하면(일부 수정 후) 데이터는 다음과 같은 이름으로 저장됩니다._id
실제 ID가 생성되기를 원합니다.
그러면 이름을 변경하려면 어떻게 해야 합니까? _id
끝나고$group
작전?
파이프라인 끝에 다음과 같은 단계를 추가하여 이를 달성할 수 있습니다.
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
온라인으로 시도해 보십시오: mongoplayground.net/p/QpVyh-0I-bP
mongo v3.4와 함께 사용할 수 있는$project
모든 필드를 쓰는 것을 피합니다.$project
매우 지루할 수 있습니다.
다음에서 발생하는 일$project
특정 필드를 포함하면 다른 필드가 자동으로 제외되기 때문입니다.
예:
{
$addFields: { my_new_id_name: "$_id" }
},
{
$project: { _id: 0 }
}
db.report.aggregate(
{
$group: {_id: '$name'}
},
{
$project:{
name:"$_id",
_id:false} }
)
시작 위치Mongo 4.2
/단계 조합을 사용할 수 있습니다.
// { x: 1, z: "a" }
// { x: 2, z: "b" }
db.collection.aggregate([
{ $set: { y: "$x" } },
{ $unset: "x" }
])
// { y: 1, z: "a" }
// { y: 2, z: "b" }
단계는 문서에 새 필드를 추가하고, 단계는 문서에서 이름을 바꿀 필드를 제거/제외합니다.
을 사용하는 경우find
방법 당신은 이것을 할 수 없지만, 만약 당신이 사용한다면.aggregation
다음과 같이 매우 쉽습니다.
db.collectionName.aggregate([
{
$project: {
newName: "$existingKeyName"
}
}
]);
다음은 MongoTemplate를 사용하는 Java에서의 작업 예제입니다.
GroupOperation groupByMovie = Aggregation.group("movieId")
.avg("rating").as("averageRating");
SortOperation sortByAvgRatingDesc = Aggregation.sort(Sort.Direction.DESC, "averageRating");
LimitOperation limitRows = Aggregation.limit(limit);
ProjectionOperation projectionOperation = Aggregation.project()
.and("_id").as("movieId")
.and("averageRating").as("averageRating")
.andExclude("_id");
Aggregation aggregation = Aggregation.newAggregation(
groupByMovie,
projectionOperation,
sortByAvgRatingDesc,
limitRows
);
AggregationResults<TopRatedMovie> results = mongoTemplate.aggregate(aggregation, MovieRating.class, TopRatedMovie.class);
return results.getMappedResults();
질문이 Java로 해결책을 찾음에도 불구하고 모든 답변이 MongoDB 쿼리로 작성되므로, 포스트에 Java를 사용한 접근 방식을 게시합니다.
그룹화 후 이름을 변경할 수 있습니다._id
필드 이름사용Projections.computed("<expected field name>", "$_id")))
질문에 언급된 쿼리의 핵심 부분을 Java로 변환하려면
Bson mainIdMatch = match(eq("main_id", new ObjectId("58f0f67f50c6af16709fd2c7")));
Bson group = Aggregates.group("$name", Accumulators.sum("count", 1L));
Bson project = Aggregates.project(Projections.fields(Projections.excludeId(),
Projections.computed("name", "$_id")));
reportMongoCollection.aggregate(Arrays.asList(mainIdMatch, group, project))
.into(new ArrayList<>());
구체적으로 답변하기 위해 위의 코드 스니펫에서 발췌한 내용을 추가했습니다. 여기서 이름을 변경합니다._id
필드 값을 이름으로 사용Projections.computed("name", "$_id")
의 가치를 매핑하는 것._id
라고 불리는 분야에 그룹화한 결과 우리는 그것을 얻었습니다.name
또한, 우리는 다음을 사용하여 id를 제외해야 합니다.Projections.excludeId()
.
Aggregates.project(Projections.fields(Projections.excludeId(),
Projections.computed("name", "$_id")))
언급URL : https://stackoverflow.com/questions/43537943/is-it-possible-to-rename-id-field-after-mongos-group-aggregation
'programing' 카테고리의 다른 글
jOOQ가 DSL.condition()의 값을 바인딩하지 않습니다. (0) | 2023.06.08 |
---|---|
Gradle을 사용하여 릴리스 서명된 pk 파일을 만드는 방법은 무엇입니까? (0) | 2023.06.03 |
RSpec과 시간 비교 문제 (0) | 2023.06.03 |
Xcode 4 - "보관"이 회색으로 표시됩니까? (0) | 2023.06.03 |
Ruby에서 클래스의 모든 하위 항목 검색 (0) | 2023.06.03 |