복붙노트

[SPRING] Spring + Mongo에서 문서 배열에서 항목 제거

SPRING

Spring + Mongo에서 문서 배열에서 항목 제거

나는 mongodb에서 이와 같은 문서 모음을 가지고있다.

"_id" : ObjectId("592bc37c339e7a23788b4c7c"),
"trips" : [ 
    {
        "tripGcsId" : "5937f86e339e7a2a58ac3186",
        "tripCounter" : NumberLong(1283),
        "tripRef" : "hjkhjk"
    }, 
    {
        "tripGcsId" : "5937f914339e7a2a58ac318b",
        "tripCounter" : NumberLong(1284),
        "tripRef" : "fjh"
    }
]

및 서버 측의 메소드 (Spring + Mongo) :

public List<String> removeTripObject( List<String> tripIds )
{
    Query query = Query.query( Criteria.where( "trips" ).elemMatch( Criteria.where( "tripGcsId" ).in( tripIds ) ) );

    Update update = new Update().pullAll( "trips.tripGcsId", new Object[] { tripIds } );
    getMongoTemplate().updateMulti( query, update, "ORDER" );
    return updatedOrders;
}

tripIds 매개 변수는 trip 배열에서 제거 할 tripGcsIds의 목록입니다. 위의 방법은 다음과 같은 오류 메시지를 표시합니다. 오류 코드 16837로 쓰기가 실패했으며 'trips.tripGcsId의 부품을 사용하여 요소를 통과 할 수 없습니다'라는 오류 메시지가 표시됩니다.

$ 연산자를 사용하려고하면 다음과 같이 다른 답변이 표시됩니다.

public List<String> removeTripObject( List<String> tripIds )
{
    Query query = Query.query( Criteria.where( "trips" ).elemMatch( Criteria.where( "tripGcsId" ).in( tripIds ) ) );

    Update update = new Update().pullAll( "trips.$.tripGcsId", new Object[] { tripIds } );
    getMongoTemplate().updateMulti( query, update, "ORDER" );
    return updatedOrders;
}

이 오류가 발생했습니다 : 오류 코드 16837 및 '$ pullAll 배열에만 적용 할 수 있습니다.'오류 메시지와 함께 쓰기가 실패했습니다.

이 pullAll 명령은 서버 측에서 어떻게 보이는지 잘 모르겠습니다.

해결법

  1. ==============================

    1.임베디드 배열에서 일치하는 모든 행을 일치시키고 삭제하기 위해 쿼리를 취하는 $ pull update 연산자를 사용해야합니다.

    임베디드 배열에서 일치하는 모든 행을 일치시키고 삭제하기 위해 쿼리를 취하는 $ pull update 연산자를 사용해야합니다.

    좋아요.

    public List<String> removeTripObject( List<String> tripIds ) {
        Query query = Query.query( Criteria.where( "tripGcsId" ).in( tripIds ) );
        Update update = new Update().pull("trips", query );
        getMongoTemplate().updateMulti( new Query(), update, "ORDER" );
        return updatedOrders;
    }
    

    참고

    https://docs.mongodb.com/manual/reference/operator/update/pull/#remove-items-from-an-array-of-documents

  2. from https://stackoverflow.com/questions/44413686/remove-items-from-array-of-documents-in-springmongo by cc-by-sa and MIT license