MongoDB에서 배열 요소의 순서를 변경하는 방법
MongoDB에서 배열(array) 내부 요소들의 순서를 바꾸고 싶다면 스왑(swap, 값 교환) 개념을 활용하면 됩니다. 스왑은 두 값을 서로 맞바꾸는 기본적인 프로그래밍 기법으로, 임시 변수(temporary variable)를 사용해 첫 번째 요소와 두 번째 요소의 자리를 교환할 수 있습니다.
아래에서 실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 컬렉션 생성 및 문서 삽입
먼저 insertOne() 메서드를 사용해 배열 필드를 가진 문서를 컬렉션에 삽입합니다.
> db.demo301.insertOne({"Name":["Chris","David","Bob"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d6ff55d93261e4bc9ea51")
}2단계: 현재 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.demo301.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e4d6ff55d93261e4bc9ea51"), "Name" : [ "Chris", "David", "Bob" ] }현재 배열은 ["Chris", "David", "Bob"] 순서로 저장되어 있습니다.
3단계: 스왑 로직으로 배열 순서 변경
다음은 forEach()문와 임시 변수를 활용해 첫 번째 요소와 두 번째 요소의 순서를 교환하는 쿼리입니다.
> db.demo301.find({}, { Name : 1 }).forEach(function(n) {
... var t = n.Name[0];
... n.Name[0] = n.Name[1];
... n.Name[1] = t;
... db.demo301.update({ _id: n._id }, { $set: { Name: n.Name } });
...})동작 원리:
var t = n.Name[0]: 첫 번째 요소("Chris")를 임시 변수t에 저장합니다.n.Name[0] = n.Name[1]: 두 번째 요소("David")를 첫 번째 자리에 넣습니다.n.Name[1] = t: 임시 변수에 저장해 둔 값을 두 번째 자리에 넣습니다.$set연산자를 사용해 변경된 배열을 해당 문서에 업데이트합니다.
4단계: 변경 결과 확인
업데이트가 완료되면 다시 find() 메서드로 모든 문서를 조회합니다.
> db.demo301.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e4d6ff55d93261e4bc9ea51"), "Name" : [ "David", "Chris", "Bob" ] }출력 결과를 보면 첫 번째 요소와 두 번째 요소가 성공적으로 맞바뀌어 ["David", "Chris", "Bob"] 순서로 변경된 것을 확인할 수 있습니다.
참고 사항
위 예제는 MongoDB 구버전에서 사용되던 update() 메서드를 기준으로 작성되었습니다. 최신 버전(3.x 이상)에서는 updateOne() 또는 updateMany() 메서드를 사용하는 것이 권장됩니다. 예를 들어 마지막 줄을 다음과 같이 수정하면 됩니다.
db.demo301.updateOne({ _id: n._id }, { $set: { Name: n.Name } });이처럼 스왑 개념과 forEach(), $set 연산자를 조합하면 MongoDB에서 배열 요소의 순서를 손쉽게 변경할 수 있습니다.