MongoDB에서 이미 생성된 컬렉션에 새로운 문서를 추가하려면 $push 연산자를 사용하면 됩니다. $push는 배열 필드에 새로운 요소를 추가할 때 활용되는 업데이트 연산자로, 배열의 마지막에 값을 삽입합니다.
1. 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 demo177 컬렉션을 생성하고 샘플 문서를 삽입해 보겠습니다.
> db.demo177.insertOne(
{ "Id": "101", "details": [
{ "StudentName": "Chris", "Scores": [67, 71, 74], "SubjectName": ["MySQL", "Java"] },
{ "StudentName": "David", "Scores": [89, 98, 45], "SubjectName": ["PL/SQL", "C"] }
] }
);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e384b2b9e4f06af551997f4")
}2. 현재 저장된 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션 내 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.demo177.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e384b2b9e4f06af551997f4"),
"Id" : "101",
"details" : [
{
"StudentName" : "Chris",
"Scores" : [ 67, 71, 74 ],
"SubjectName" : [ "MySQL", "Java" ]
},
{
"StudentName" : "David",
"Scores" : [ 89, 98, 45 ],
"SubjectName" : [ "PL/SQL", "C" ]
}
]
}3. $push로 기존 컬렉션에 문서 추가하기
이제 update() 메서드와 $push 연산자를 조합하여 details 배열에 새로운 학생 정보를 추가해 보겠습니다. 조건으로 Id가 "101"인 문서를 찾은 뒤, 해당 문서의 details 배열 끝에 새 요소를 삽입합니다.
> db.demo177.update({"Id": "101"},
...{
... $push: {
... "details": {
... "StudentName": "Chris",
... "Scores": [90, 91, 94],
... "SubjectName": ["MongoDB", "SQL Server"]
... }
... }
...});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })실행 결과에서 nMatched가 1, nModified가 1로 표시되는 것을 확인할 수 있습니다. 이는 조건에 일치하는 문서 하나가 성공적으로 수정되었음을 의미합니다.
4. 업데이트 결과 확인하기
다시 find() 메서드를 실행하여 변경된 결과를 확인해 보겠습니다.
> db.demo177.find().pretty();
새로운 문서가 details 배열의 마지막에 정상적으로 추가된 것을 볼 수 있습니다.
{
"_id" : ObjectId("5e384b2b9e4f06af551997f4"),
"Id" : "101",
"details" : [
{
"StudentName" : "Chris",
"Scores" : [ 67, 71, 74 ],
"SubjectName" : [ "MySQL", "Java" ]
},
{
"StudentName" : "David",
"Scores" : [ 89, 98, 45 ],
"SubjectName" : [ "PL/SQL", "C" ]
},
{
"StudentName" : "Chris",
"Scores" : [ 90, 91, 94 ],
"SubjectName" : [ "MongoDB", "SQL Server" ]
}
]
}참고 사항
MongoDB 최신 버전에서는 update() 대신 updateOne() 또는 updateMany() 메서드 사용이 권장됩니다. 예를 들어 위 코드는 다음과 같이 작성할 수 있습니다.
> db.demo177.updateOne(
{ "Id": "101" },
{ $push: { "details": { "StudentName": "Chris", "Scores": [90, 91, 94], "SubjectName": ["MongoDB", "SQL Server"] } } }
);또한 $push 외에도 배열 맨 앞에 요소를 추가하는 $each, 중복을 방지하는 $addToSet 등의 연산자를 상황에 맞게 활용하면 더욱 효율적인 데이터 관리가 가능합니다.