MongoDB에서 MapReduce로 랜덤 값 가져오기
MapReduce 개념을 활용해 MongoDB에서 랜덤 값을 추출하려면 mapReduce() 함수와 JavaScript의 Math.random()을 함께 사용하면 됩니다. 이 방식은 각 문서마다 난수를 생성한 뒤, 설정한 조건(예: 0.1 미만)을 만족하는 문서만 선택하는 원리로 동작합니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo651.insertOne({Value:10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f0330e3c3cd0dcff36a57")
}
> db.demo651.insertOne({Value:20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f0332e3c3cd0dcff36a58")
}
> db.demo651.insertOne({Value:30});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f0335e3c3cd0dcff36a59")
}
> db.demo651.insertOne({Value:40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f0337e3c3cd0dcff36a5a")
}
> db.demo651.insertOne({Value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f0339e3c3cd0dcff36a5b")
}
> db.demo651.insertOne({Value:60});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f033be3c3cd0dcff36a5c")
}
> db.demo651.insertOne({Value:70});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f033ee3c3cd0dcff36a5d")
}
> db.demo651.insertOne({Value:80});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9f0340e3c3cd0dcff36a5e")
}컬렉션의 모든 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo651.find();
위 명령을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : ObjectId("5e9f0330e3c3cd0dcff36a57"), "Value" : 10 }
{ "_id" : ObjectId("5e9f0332e3c3cd0dcff36a58"), "Value" : 20 }
{ "_id" : ObjectId("5e9f0335e3c3cd0dcff36a59"), "Value" : 30 }
{ "_id" : ObjectId("5e9f0337e3c3cd0dcff36a5a"), "Value" : 40 }
{ "_id" : ObjectId("5e9f0339e3c3cd0dcff36a5b"), "Value" : 50 }
{ "_id" : ObjectId("5e9f033be3c3cd0dcff36a5c"), "Value" : 60 }
{ "_id" : ObjectId("5e9f033ee3c3cd0dcff36a5d"), "Value" : 70 }
{ "_id" : ObjectId("5e9f0340e3c3cd0dcff36a5e"), "Value" : 80 }MapReduce를 사용한 랜덤 데이터 조회 쿼리
다음은 map 함수와 reduce 함수를 정의한 후 mapReduce()를 실행하여 랜덤하게 데이터를 추출하는 쿼리입니다. map 함수 내부에서 Math.random() 값이 0.1보다 작을 때만 해당 문서를 emit하도록 하여, 약 10%의 확률로 문서가 선택되게 만듭니다.
> map = function() {
...
... if (Math.random() < 0.1) {
... emit(this._id, this);
... }
... }
function () {
if (Math.random() < 0.1) {
emit(this._id, this);
}
}
>
> reduce = function(key, values) {
... return values;
... }
function (key, values) {
return values;
}
>
> db.demo651.mapReduce( map, reduce, { out: 'demo_651' } );
{
"result" : "demo_651",
"timeMillis" : 1104,
"counts" : {
"input" : 8,
"emit" : 1,
"reduce" : 0,
"output" : 1
},
"ok" : 1
}
> db.demo_651.find();mapReduce 실행 결과로 demo_651이라는 출력 컬렉션이 새로 생성되며, 그 안에는 랜덤하게 선택된 문서가 저장됩니다. 위 예제에서는 Value가 60인 문서가 선택된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e9f033be3c3cd0dcff36a5c"), "value" : { "_id" : ObjectId("5e9f033be3c3cd0dcff36a5c"), "Value" : 60 } }