mongoDb에서 인덱스로 어레이 요소를 삭제하려면 어떻게 해야 합니까?
다음 예제에서는 문서가 db.people 컬렉션에 있다고 가정합니다.
색인별로 관심 배열의 세 번째 요소를 제거하려면 어떻게 해야 합니까?
{
"_id" : ObjectId("4d1cb5de451600000000497a"),
"name" : "dannie",
"interests" : [
"guitar",
"programming",
"gadgets",
"reading"
]
}
현재의 솔루션은 다음과 같습니다.
var interests = db.people.findOne({"name":"dannie"}).interests;
interests.splice(2,1)
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});
좀 더 직접적인 방법은 없나요?
어레이 인덱스를 사용하여 바로 풀/삭제할 수 있는 방법은 없습니다.사실, 이것은 미공개호 http://jira.mongodb.org/browse/SERVER-1014입니다.여러분은 투표하실 수 있습니다.
이 회피책에서는 $unset을 사용한 후 $pull을 사용합니다.
db.lists.update({}, {$unset : {"interests.3" : 1 }})
db.lists.update({}, {$pull : {"interests" : null}})
업데이트: 코멘트 중 일부에서 설명한 바와 같이 이 접근법은 원자성이 아니며 다른 클라이언트가 두 작업 사이에서 읽거나 쓰기를 할 경우 일부 레이스 상태가 발생할 수 있습니다.원자적인 조작이 필요한 경우는, 다음과 같이 할 수 있습니다.
- 데이터베이스에서 문서 읽기
- 문서를 갱신하고 어레이 내의 아이템을 삭제합니다.
- 데이터베이스에서 문서를 바꿉니다.문서를 읽은 후 변경되지 않도록 하기 위해 현재 패턴이 mongo 문서에 기술되어 있는 경우 업데이트를 사용할 수 있습니다.
사용할 수 있습니다.$pull
의 수식어.update
배열의 특정 요소를 제거하는 작업입니다.쿼리를 제공한 경우 다음과 같이 표시됩니다.
db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})
또, 다음의 기능을 사용하는 것을 고려해 주세요.$pullAll
모든 발생을 제거합니다.상세한 것에 대하여는, 공식 메뉴얼 페이지를 참조해 주세요.http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull
이렇게 하면 인덱스를 요소 제거 기준으로 사용하지 않지만 유사한 경우에도 도움이 될 수 있습니다.IMO는 어레이 내의 요소를 지정하기 위해 인덱스를 사용하는 것은 신뢰성이 높지 않습니다.mongodb는 fas의 요소 순서에서 일관성이 없기 때문입니다.
Mongodb 4.2에서는 다음을 수행할 수 있습니다.
db.example.update({}, [
{$set: {field: {
$concatArrays: [
{$slice: ["$field", P]},
{$slice: ["$field", {$add: [1, P]}, {$size: "$field"}]}
]
}}}
]);
P는 배열에서 제거할 요소의 인덱스입니다.
P에서 끝까지 삭제할 경우:
db.example.update({}, [
{ $set: { field: { $slice: ["$field", 1] } } },
]);
시작점Mongo 4.4
aggregation 연산자는 커스텀 자바스크립트 함수를 적용하여 MongoDB Query Language에서 지원되지 않는 동작을 구현할 수 있습니다.
예를 들어 지정된 인덱스에서 요소를 제거하여 어레이를 업데이트하려면 다음 절차를 수행합니다.
// { "name": "dannie", "interests": ["guitar", "programming", "gadgets", "reading"] }
db.collection.update(
{ "name": "dannie" },
[{ $set:
{ "interests":
{ $function: {
body: function(interests) { interests.splice(2, 1); return interests; },
args: ["$interests"],
lang: "js"
}}
}
}]
)
// { "name": "dannie", "interests": ["guitar", "programming", "reading"] }
$function
는 다음 3가지 파라미터를 취합니다.
body
적용할 함수이며 파라미터는 변경할 배열입니다.여기서의 기능은 단순히 스플라이스를 사용하여 인덱스 2에서 하나의 요소를 제거하는 것으로 구성됩니다.args
되어 있습니다.body
함수는 매개 변수로 사용합니다. 경우 ★★★★★★★★★★★★★★★★★★★★★★★★★★」"$interests"
.lang
는 ' 언어인지', '어느 인지', ' 언어인지', '어느 언어인지', '어느 언어인지', '어느 언어인지', '어느 언어인지body
수가써써 써써써다다만.js
는 현재 이용 가능합니다.
(허용된 답변과 같이) 설정되지 않은 값을 사용하는 것이 아니라 필드를 고유한 값(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}});
mongo가 $push와 $push를 지원하도록 $position 수식자를 확장함으로써 이 문제를 해결할 수 있기를 바랍니다.
GUID 사용을 권장합니다(오브젝트를 사용하는 경향이 있습니다).ID) 필드 또는 배열 내의 각 하위 문서에 대한 자동 증분 필드.
이 GUID를 사용하면 $pull을 쉽게 발행할 수 있으며 올바른 GUID가 인출되는지 확인합니다.다른 어레이 조작도 마찬가지입니다.
nodejs와 함께 mongoose를 사용하여 답을 검색하시는 분들을 위해.이렇게 하는 거예요.
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 }); });
}
이 답변이 잘 이해되지 않으면 다시 쓸 수 있지만, 저는 괜찮다고 생각합니다.
도움이 되시길 바랍니다. 이 문제로 많은 시간을 허비했습니다.
조금 늦었지만 로보3t를 사용하고 있는 사람에게 도움이 될 수도 있습니다.
db.getCollection('people').update(
{"name":"dannie"},
{ $pull:
{
interests: "guitar" // you can change value to
}
},
{ multi: true }
);
가치관이 있다면...
property: [
{
"key" : "key1",
"value" : "value 1"
},
{
"key" : "key2",
"value" : "value 2"
},
{
"key" : "key3",
"value" : "value 3"
}
]
키가 key3인 레코드를 삭제하고 싶은 경우, 어떤 것을 사용할 수 있습니다.
db.getCollection('people').update(
{"name":"dannie"},
{ $pull:
{
property: { key: "key3"} // you can change value to
}
},
{ multi: true }
);
중첩된 속성도 마찬가지입니다.
은 $연산자 $pop을 사용하여 할 수 .
db.getCollection('collection_name').updateOne( {}, {$pop: {"path_to_array_object":1}})
언급URL : https://stackoverflow.com/questions/4588303/in-mongodb-how-do-you-remove-an-array-element-by-its-index
'source' 카테고리의 다른 글
공통 라이브러리를 만드는 스프링 부트 사용 방법 (0) | 2023.03.28 |
---|---|
AWS EFS의 성능 저하 (0) | 2023.03.28 |
Android에서 React Native가 빌드 도구를 찾지 못했습니다. (0) | 2023.03.28 |
ReactJS에서 객체를 매핑하려면 어떻게 해야 합니까? (0) | 2023.03.28 |
Mongo 개체에서 생성된 날짜를 추출하려면 어떻게 해야 합니까?아이디 (0) | 2023.03.28 |