복붙노트

[MONGODB] MongoDB의에서, 당신은 어떻게 인덱스에 의해 배열 요소를 제거합니까

MONGODB

MongoDB의에서, 당신은 어떻게 인덱스에 의해 배열 요소를 제거합니까

{

        "_id" : ObjectId("4d1cb5de451600000000497a"),           
        "name" : "dannie",  
        "interests" : [  
            "guitar",  
            "programming",           
            "gadgets",  
            "reading"  
        ]   
}

위의 예에서, 위의 문서는 db.people 컬렉션입니다 가정합니다. 어떻게의 인덱스로 이익 배열의 3 요소를 제거하려면?

편집하다:

이것은 나의 현재의 솔루션입니다 :

var interests = db.people.findOne({"name":"dannie"}).interests;  
interests.splice(2,1)  
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

더 직접적인 방법이 있나요?

해결법

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

    1./ 당기 배열 인덱스에 의해 제거에는 직선 방법이 없습니다. 사실, 이것은 당신이 그것을 위해 투표 할 수 있습니다, http://jira.mongodb.org/browse/SERVER-1014 개방 문제입니다.

    / 당기 배열 인덱스에 의해 제거에는 직선 방법이 없습니다. 사실, 이것은 당신이 그것을 위해 투표 할 수 있습니다, http://jira.mongodb.org/browse/SERVER-1014 개방 문제입니다.

    해결 방법은 $ 해제 한 후 $ 풀을 사용하고 있습니다 :

    db.lists.update({}, {$unset : {"interests.3" : 1 }}) 
    db.lists.update({}, {$pull : {"interests" : null}})
    

    업데이트 : 코멘트 중 일부에서 언급 한 바와 같이이 방법은 원자하지 않고 다른 클라이언트가 두 작업 사이에 읽기 및 / 또는 쓰기 경우 일부 경쟁 상태가 발생할 수 있습니다. 우리가 원자로 작업을 필요로하는 경우에, 우리는 할 수 :

  2. ==============================

    2.당신은 배열의 특정 요소를 제거하기위한 업데이트 작업의 $ 풀 수정을 사용할 수 있습니다. 경우에 당신은 쿼리는 다음과 같이됩니다 제공 :

    당신은 배열의 특정 요소를 제거하기위한 업데이트 작업의 $ 풀 수정을 사용할 수 있습니다. 경우에 당신은 쿼리는 다음과 같이됩니다 제공 :

    db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})
    

    또한, 모든 항목을 제거하기 위해 $ pullAll 사용을 고려할 수 있습니다. 보기에 대한 공식 문서 페이지 - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull

    이 요소를 제거하기위한 기준으로 인덱스를 사용하지 않는,하지만 여전히 당신과 비슷한 경우에 도움이 될 수 있습니다. 내가 아는 한 MongoDB를가 FAS와 같은 요소를 순서에 일치하지 않기 때문에 IMO, 배열의 내부 요소를 해결하기위한 인덱스를 사용하는 것은 매우 신뢰할 수 없습니다.

  3. ==============================

    3.나는 GUID (나는 OBJECTID를 사용하는 경향이) 필드 또는 배열의 각 하위 문서에 대한 자동 증가 필드를 사용하여 추천 할 것입니다.

    나는 GUID (나는 OBJECTID를 사용하는 경향이) 필드 또는 배열의 각 하위 문서에 대한 자동 증가 필드를 사용하여 추천 할 것입니다.

    이 GUID로 달러 (A $)의 풀을 발행하고 올바른 당기면됩니다 있는지 확인하기 쉬운 것입니다. 같은 다른 배열 작업에 간다.

  4. ==============================

    4.오히려 (허용 대답에서와 같은) 해제를 사용하는 대신, I (즉하지 NULL) 고유 한 값으로 필드를 설정 한 후 즉시 그 값을 인상함으로써 해결. 비동기 관점에서 안전 약간. 여기에 코드입니다 :

    오히려 (허용 대답에서와 같은) 해제를 사용하는 대신, I (즉하지 NULL) 고유 한 값으로 필드를 설정 한 후 즉시 그 값을 인상함으로써 해결. 비동기 관점에서 안전 약간. 여기에 코드입니다 :

        var update = {};
        var key = "ToBePulled_"+ new Date().toString();
        update['feedback.'+index] = key;
        Venues.update(venueId, {$set: update});
        return Venues.update(venueId, {$pull: {feedback: key}});
    

    다행히 몽고 아마도 $ 손잡이뿐만 아니라, $ 푸시를 지원할 $ 위치 개질제를 확장하여,이 문제를 해결한다.

  5. ==============================

    5.nodejs와 몽구스를 사용하여 답을 찾고 사람들을 위해. 이것은 내가 그것을 할 방법이다.

    nodejs와 몽구스를 사용하여 답을 찾고 사람들을 위해. 이것은 내가 그것을 할 방법이다.

    exports.deletePregunta = function (req, res) {
    let codTest = req.params.tCodigo;
    let indexPregunta = req.body.pregunta; // the index that come from frontend
    let inPregunta = `tPreguntas.0.pregunta.${indexPregunta}`; // my field in my db
    let inOpciones = `tPreguntas.0.opciones.${indexPregunta}`; // my other field in my db
    let inTipo = `tPreguntas.0.tipo.${indexPregunta}`; // my  other field in my db
    
    Test.findOneAndUpdate({ tCodigo: codTest },
        {
            '$unset': {
                [inPregunta]: 1, // put the field with [] 
                [inOpciones]: 1,
                [inTipo]: 1
            }
        }).then(()=>{ 
        Test.findOneAndUpdate({ tCodigo: codTest }, {
            '$pull': {
                'tPreguntas.0.pregunta': null,
                'tPreguntas.0.opciones': null,
                'tPreguntas.0.tipo': null
            }
        }).then(testModificado => {
            if (!testModificado) {
                res.status(404).send({ accion: 'deletePregunta', message: 'No se ha podido borrar esa pregunta ' });
            } else {
                res.status(200).send({ accion: 'deletePregunta', message: 'Pregunta borrada correctamente' });
            }
        })}).catch(err => { res.status(500).send({ accion: 'deletePregunta', message: 'error en la base de datos ' + err }); });
     }
    

    그것은 아주 잘 이해 해달라고하면 나는이 대답을 다시 작성할 수 있습니다,하지만 난 괜찮아라고 생각합니다.

    이 도움말 당신이, 내가이 문제에 직면 많은 시간을 잃었 바랍니다.

  6. ==============================

    6.대신 $ 풀을 사용하는 우리는 인덱스 배열에서 요소를 제거하기위한 팝업 $를 사용할 수 있습니다. 하지만 당신은 인덱스를 기반으로 제거하는 인덱스 위치에서 1을 빼야한다.

    대신 $ 풀을 사용하는 우리는 인덱스 배열에서 요소를 제거하기위한 팝업 $를 사용할 수 있습니다. 하지만 당신은 인덱스를 기반으로 제거하는 인덱스 위치에서 1을 빼야한다.

    예컨대 들어 당신은 당신이에 공 등을 사용한다 인덱스 1 -1 사용해야 인덱스 0의 요소를 제거하려면 ...

    쿼리 3 요소 (기기)를 제거하려면 :

    (: { '$ 팝': { "관심": 1}} { "인 Dannie" "이름이"}) db.people.update

    참조 : https://docs.mongodb.com/manual/reference/operator/update/pop/

  7. from https://stackoverflow.com/questions/4588303/in-mongodb-how-do-you-remove-an-array-element-by-its-index by cc-by-sa and MIT license