programing

mongo의 그룹 집계 후 _id 필드의 이름을 변경할 수 있습니까?

oldcodes 2023. 6. 3. 08:44
반응형

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

반응형