MongoDB에 저장된 데이터 중 특정 Subset(Array) 데이터들만 조회하는 방법에 대한 설명입니다.
MongoDB에서 데이터들을 조회할 때에는 Javascript 를 활용해서 필요한 데이터들을 조합할 수 있습니다.
1) var myCursor = db.receipt.find({}, {"storeName":1, "marketId":1, "items.barcode":1, "items.name":1, "items.unitPrice":1, _id:0});
var storeName = null;
var marketId = null;
2) while (myCursor.hasNext()) {
var allReceipt = myCursor.next();
var receipt = allReceipt.items;
marketId = allReceipt.marketId;
storeName = allReceipt.storeName;
for( var i = 0; i < receipt.length; i++ )
{
3) var item = receipt[i];
4) print(marketId + "@" + storeName + "@"+item.barcode + "@" + item.name + "@" + item.unitPrice);
}
}
몽고 DB로 데이터를 저장시에는 비정규화를 해서 데이터를 저장하도록 권장하고 있는데..
예를 들어 A라는 사람이 C1, C2, C3 라는 물건을 샀다고 가정하는 경우 해당 정보를 하나의 레코드로 저장하게 될 경우가 생깁니다.
즉 하나의 레코드는 아래와 같이 저장됩니다.
{ "Name":"A", purchaseProducts:[{"itemName":"C1"}, {"itemName":"C2"}, {"itemName":"C3"}]}
이렇게 데이터가 저장되어져 있는 경우 누가 샀는지보다 사람들이 산 모든 물건을 추출해야 할 경우가 생길 수 있는데요.
이럴 때 활용할 수 있는 MongoDB 스크립트가 위에 있는 예시 입니다.
항목별로 보면
1) 번에는 어떠한 필드를 조회할지 선택을 합니다.
즉, 조회 결과에 출력할 기본 필드에 대해서는 "필드명":1 이라고 선언하게 되면 기본적으로 find를 이용하여 데이터 조회시 해당 필드만 출력되게 됩니다. 특이한 점은 저는 MongoDB 에서 기본적으로 출력되는 "_id" 필드에 대해서는 조회할 필요가 없기에 0 으로 설정해서 출력되지 않도록 설정했습니다.
또한 해당 조회 결과를 Cursor 를 이용해서 핸들링 하려 합니다.
2) 번에서 모든 레코드를 다 읽을 때까지 반복하게 됩니다.
3) 번에서는 위의 설명에서 예를 든 하나의 레코드 안의 배열들 즉, purchaseProducts 같은 배열만 따로 변수에 할당합니다.
4) 번에서는 할당된 배열에 대해서 건별로 출력하게 됩니다.
사실 RDBMS에 익숙하다면 이러한 상황에 대해 잘 이해가 안 가실수도 있겠지만..
위에서도 언급했듯이 비정규화된 데이터들 중 레코드별로 입력된 특정 subset만 추출하고자 한다면..
여러 가지 방법을 찾아봤지만 이 방법이 최선일 것 같습니다.