Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 키를 알 수 없는 문서 찾기 – $addFields와 $objectToArray 활용법

MongoDB에서는 문서 안에 어떤 필드(키)가 들어 있을지 사전에 알 수 없는 경우에도 원하는 값을 가진 문서를 검색할 수 있습니다. 이때 활용하는 것이 바로 $addFields$objectToArray 집계 연산자입니다. $objectToArray는 도큐먼트를 { k: 키, v: 값 } 형태의 배열로 변환해 주기 때문에, 키 이름을 몰라도 값에 접근할 수 있다는 장점이 있습니다.

1. 샘플 컬렉션 생성 및 문서 삽입

먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.

> db.demo375.insertOne(
...    {
...       "details":{
...          "Name":"John",
...          "Age":23
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b06")
}
> db.demo375.insertOne(
...    {
...       "details":{
...          "Name":"David",
...          "Age":21
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b07")
}
> db.demo375.insertOne(
...    {
...       "details":{
...          "Name":"David",
...          "Age":22
...       }
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b08")
}

2. find()로 전체 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 한눈에 확인할 수 있습니다.

> db.demo375.find();

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b06"), "details" : { "Name" : "John", "Age" : 23 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b07"), "details" : { "Name" : "David", "Age" : 21 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b08"), "details" : { "Name" : "David", "Age" : 22 } }

3. 키를 알 수 없는 상태에서 문서 검색하기

다음은 $addFields$objectToArray를 조합하여, 키 구조를 몰라도 Name 값이 "David"인 문서를 찾아내는 애그리게이션 쿼리입니다.

> db.demo375.aggregate([
...    { "$addFields": {
...       "UnknownKeys": { "$objectToArray": "$$ROOT" }
...    }},
...    { "$match": { "UnknownKeys.v.Name": "David" }},
...    { "$project": { "UnknownKeys": 0 }}
... ])

실행 결과는 다음과 같습니다.

{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b07"), "details" : { "Name" : "David", "Age" : 21 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b08"), "details" : { "Name" : "David", "Age" : 22 } }

쿼리 동작 방식 살펴보기

  • $addFields: 각 문서에 임시 필드 UnknownKeys를 추가합니다.
  • $objectToArray: 루트 문서($$ROOT)를 k(키)와 v(값) 쌍으로 이루어진 배열로 변환합니다.
  • $match: 변환된 배열 안에서 v.Name이 "David"인 문서만 필터링합니다.
  • $project: 임시로 생성한 UnknownKeys 필드를 최종 결과에서 제외합니다.

이처럼 $objectToArray를 활용하면 스키마가 고정되어 있지 않거나 키 이름을 예측하기 어려운 컬렉션에서도 유연하게 데이터를 조회할 수 있습니다. 다만 문서 전체를 배열로 변환하는 작업이 포함되므로, 대량의 데이터를 다룰 때는 성능에 미치는 영향을 함께 고려하는 것이 좋습니다.