MongoDB 배열에서 요소 제거

Mehvish Ashiq 2023년1월30일
  1. MongoDB 배열에서 요소 제거
  2. MongoDB $pull을 사용하여 문서 배열에서 요소 제거
  3. MongoDB $pullAll을 사용하여 배열에서 요소 제거
  4. MongoDB $pop을 사용하여 배열에서 요소 제거
  5. MongoDB $unset을 사용하여 주어진 요소를 포함하는 필드 제거
  6. MongoDB 위치 연산자를 사용하여 요소를 제거하는 대신 null로 설정
MongoDB 배열에서 요소 제거

프로젝트 요구 사항에 따라 다른 접근 방식을 채택할 수 있습니다. 오늘은 $pull, $pullAll, $pop, $unset 및 위치 연산자($)를 사용하여 작업하는 동안 문서 배열 또는 배열에서 요소를 제거하는 방법을 배웁니다. 몽고DB에서.

MongoDB 배열에서 요소 제거

언급된 모든 방법을 연습하려면 샘플 문서 모음이 있어야 합니다. collection이라는 컬렉션을 만들고 하나의 문서만 삽입합니다.

하나의 문서를 포함하는 다음 컬렉션을 사용할 수도 있습니다.

예제 코드:

// MongoDB version 5.0.8

> db.collection.insertMany([
    {
        contact: {
            phone: [
                {"type" : "UAN", "number" : "123456789"},
                {"type" : "office", "number" : "987546321"},
                {"type" : "personal", "number" : "852147963"}
            ]
        },
        services: ["Google", "Instagram", "Twitter", "Facebook"],
        scores: [ 0, 1, 8, 17, 18, 8, 20, 10 ]
    },
    {
        contact: {
            phone: [
                {"type" : "UAN", "number" : "456321879"},
                {"type" : "office", "number" : "874596321"},
                {"type" : "personal", "number" : "964785123"}
            ]
        },
        services: ["Google", "Instagram", "Twitter"],
        scores: [ 1, 8, 2, 3, 8, 7, 1 ]

    }
]);

collection이라는 컬렉션이 없더라도 걱정하지 마십시오. 위의 쿼리는 당신을 위해 그것을 생성하고 채울 것입니다. 다음으로 db.collection.find().pretty()를 실행하여 삽입된 문서를 볼 수 있습니다.

다음 코드 예제를 실행한 후에는 업데이트된 문서를 볼 수 없다는 것을 기억하십시오. 이를 위해서는 db.collection.find().pretty() 명령을 실행해야 합니다.

MongoDB $pull을 사용하여 문서 배열에서 요소 제거

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
    { _id : ObjectId("62aae796f27219958a489b89") },
    { $pull : { "contact.phone": { "number": "987546321" } } }
);

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "UAN", "number" : "123456789" },
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
     "scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "UAN", "number" : "456321879" },
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Google", "Instagram", "Twitter" ],
     "scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}

여기에서 $pull 연산자를 사용하여 필터 쿼리 또는 지정된 조건과 일치하는 기존 배열에서 값/값의 모든 인스턴스를 제거합니다.

위의 코드 예에서 _idObjectId("62aae796f27219958a489b89")와 동일한 문서를 검색하고 있습니다. 문서가 지정된 조건과 일치하면 contact.phone.number987546321과 동일한 기존 배열에서 인스턴스를 제거합니다.

$pull 연산자를 사용하는 동안 다음 사항을 기억하십시오.

  • 제거해야 하는 주어진 value가 배열인 경우 $pull 연산자는 주어진 value(순서 포함)를 정확히 충족하는 요소만 배열에서 제거합니다.
  • 제거해야 하는 지정된 이 문서인 경우 $pull 연산자는 정확한 필드 및 값이 포함된 배열에서만 요소를 제거합니다. 필드의 순서는 여기에서 다를 수 있습니다.
  • 주어진 condition과 배열의 요소가 포함된 문서인 경우 $pull 연산자는 모든 배열 요소가 컬렉션의 문서인 것처럼 condition을 적용합니다. 이에 대한 자세한 내용은 이것을 확인하실 수 있습니다.

이제 컬렉션의 모든 문서에 대해 제거 작업을 수행하려는 또 다른 상황이 있습니다. 이를 위해 $pull을 사용하여 다음 구문을 사용하는 반면 {multi: true}는 지정된 조건의 모든 문서에서 작동합니다.

예제 코드:

// MongoDB version 5.0.8

> db.collection.update({},
  { $pull: { "contact.phone": { "type": "UAN" } } },
  { multi: true }
);

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
     "scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Google", "Instagram", "Twitter" ],
     "scores" : [ 1, 8, 2, 3, 8, 7, 1 ]
}

위의 출력을 얻으려면 contact.phone.type"UAN"과 동일한 컬렉션의 모든 문서에서 배열 요소를 제거합니다.

다음 작업은 scores 배열에서 값이 2보다 크거나 같고 6( 2 <= value <= 6 )보다 작거나 같은 요소를 제거하는 것입니다. 선택한 컬렉션의 모든 문서에 대해 다음 쿼리를 실행합니다.

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
    {},
    { $pull : { scores : {$gte: 2, $lte: 6} } },
    { multi: true }
)

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Google", "Instagram", "Twitter", "Facebook" ],
     "scores" : [ 0, 1, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Google", "Instagram", "Twitter" ],
     "scores" : [ 1, 8, 8, 7, 1 ]
}

문자열 유형 값으로 연습하려면 다음과 같이 하면 됩니다.

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
    {},
    { $pull: { "services": { $in: [ "Google", "Instagram" ] }, "scores": 1 } },
    { multi: true }
)

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ],
     "scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 8, 8, 7 ]
}

이 코드 예제에서는 $in 비교 연산자를 사용하여 값 배열을 갖고 그 중 하나라도 있으면 services 배열에서 제거합니다.

또한 $pull 연산자를 사용하여 이 모든 제거 작업을 수행하는 동안 scores 배열에서 1을 제거합니다.

MongoDB $pullAll을 사용하여 배열에서 요소 제거

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
    { _id: ObjectId("62aae796f27219958a489b8a") },
    { $pullAll: { "scores": [8] } }
)

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ],
     "scores" : [ 0, 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

이 코드의 경우 $pullAll 연산자를 사용하여 이미 존재하는 배열에서 주어진 값의 모든 항목(인스턴스)을 제거합니다. 예를 들어, 8이라는 숫자가 score 배열에 두 번 나타나면 8 값이 모두 제거됩니다.

필터 쿼리를 지정하여 배열 요소를 제거하는 $pull 연산자와 마찬가지로 $pullAll은 나열된 값과 일치하는 배열 요소를 삭제/제거합니다.

배열에 포함된 문서를 처리하기 위해 점 표기법을 사용합니다.

MongoDB $pop을 사용하여 배열에서 요소 제거

배열에서 첫 번째 또는 마지막 요소를 제거하려는 경우 $pop 연산자를 사용할 수 있습니다. 이를 위해 -1 또는 1$pop 연산자에 전달하여 처음 또는 마지막에서 배열 요소를 제거합니다.

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
  { _id: ObjectId("62aae796f27219958a489b89") },
  { $pop: { "scores": -1 } }
)

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ],
     "scores" : [ 8, 17, 18, 8, 20, 10 ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

MongoDB $unset을 사용하여 주어진 요소를 포함하는 필드 제거

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
    { _id : ObjectId("62aae796f27219958a489b89") },
    { $unset : {"scores" : 8 }}
)

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", "Facebook" ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

여기에서 $unset 연산자를 사용하여 주어진 값을 포함하는 특정 필드를 제거합니다. 예를 들어, 필터 쿼리와 일치하고 어레이 요소로 8이 포함된 scores 필드를 제거합니다.

$unset 연산자를 위치 연산자($)와 함께 사용할 때 일치하는 요소를 제거하지 않고 null로 설정합니다. 이를 연습하려면 다음 섹션을 참조하십시오.

MongoDB 위치 연산자를 사용하여 요소를 제거하는 대신 null로 설정

예제 코드:

// MongoDB version 5.0.8

> db.collection.update(
    {"services": "Facebook"},
    { $unset: {"services.$" : 1}}
)

출력:

{
    "_id" : ObjectId("62aae796f27219958a489b89"),
    "contact" : {
        "phone" : [
            { "type" : "personal", "number" : "852147963" }
         ]
     },
     "services" : [ "Twitter", null ]
}
{
    "_id" : ObjectId("62aae796f27219958a489b8a"),
    "contact" : {
        "phone" : [
            { "type" : "office", "number" : "874596321" },
            { "type" : "personal", "number" : "964785123" }
        ]
     },
     "services" : [ "Twitter" ],
     "scores" : [ 7 ]
}

이 코드 조각은 위치 연산자와 함께 $unset을 사용하여 배열 요소를 제거하는 대신 null로 설정합니다. $를 사용하여 services 배열에서 값이 Facebook인 배열의 첫 번째 요소를 업데이트합니다.

이 접근 방식은 배열 요소의 위치를 모를 때 사용할 수 있습니다. 반면에 주어진 배열 필드의 모든 요소를 업데이트하려는 경우 $[](모든 위치 연산자)를 사용할 수도 있습니다.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - MongoDB Array

관련 문장 - MongoDB Document