MongoDB에서 배열의 특정 인덱스 위치에 새로운 요소를 삽입하려면 $push 연산자와 함께 $each, $position 수정자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 테스트용 컬렉션 생성
먼저 문서가 포함된 컬렉션을 생성합니다.
> db.insertToSpecificIndexDemo.insertOne({"StudentName":"Larry","StudentSubjects":["MySQL","Java"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d2562a629b87623db1b2c")
}
> db.insertToSpecificIndexDemo.insertOne({"StudentName":"Chris","StudentSubjects":["C++","C"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d2573a629b87623db1b2d")
}2. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.insertToSpecificIndexDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5c9d2562a629b87623db1b2c"),
"StudentName" : "Larry",
"StudentSubjects" : [
"MySQL",
"Java"
]
}
{
"_id" : ObjectId("5c9d2573a629b87623db1b2d"),
"StudentName" : "Chris",
"StudentSubjects" : [
"C++",
"C"
]
}3. 특정 인덱스에 요소 삽입하기
이제 _id가 "5c9d2573a629b87623db1b2d"인 문서의 배열 맨 앞(인덱스 0)에 새로운 요소를 삽입해 보겠습니다. 핵심은 $push 안에서 $each로 삽입할 값을 지정하고, $position으로 삽입될 인덱스를 지정하는 것입니다.
> db.insertToSpecificIndexDemo.update(
... { _id: ObjectId("5c9d2573a629b87623db1b2d")},
... { $push: {
... StudentSubjects: {
... $each: [ {"CoreSubject": "MongoDB"} ],
... $position: 0
... }
... }}
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })4. 삽입 결과 확인
요소가 지정한 위치에 정상적으로 삽입되었는지 다시 조회해 보겠습니다. 위 쿼리에서 인덱스로 0을 지정했으므로 배열의 가장 앞부분에 삽입되어야 합니다.
> db.insertToSpecificIndexDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9d2562a629b87623db1b2c"),
"StudentName" : "Larry",
"StudentSubjects" : [
"MySQL",
"Java"
]
}
{
"_id" : ObjectId("5c9d2573a629b87623db1b2d"),
"StudentName" : "Chris",
"StudentSubjects" : [
{
"CoreSubject" : "MongoDB"
},
"C++",
"C"
]
}결과 분석
출력 결과를 보면 "CoreSubject": "MongoDB" 항목이 기존 요소들(C++, C) 앞쪽, 즉 MongoDB 배열의 맨 처음(인덱스 0)에 성공적으로 삽입된 것을 확인할 수 있습니다.
핵심 정리
$push: 배열에 요소를 추가하는 기본 연산자입니다.$each: 여러 개의 값을 한 번에 추가할 때 사용하며,$position과 함께 사용해야 위치 지정이 가능합니다.$position: 요소가 삽입될 인덱스를 지정합니다. 음수를 사용하면 배열 끝에서부터 역순으로 위치를 지정할 수도 있습니다.
이처럼 $push 연산자에 $each와 $position을 조합하면 MongoDB 배열의 원하는 위치에 유연하게 데이터를 삽입할 수 있습니다.