✨ 연산자 활용, 집계 함수
# score 컬렉션 생성
> use my_score
switched to db my_score
> db.score.insert({name:"aaa", kor :90, eng:80, mat:98, test:"midterm"})
WriteResult({ "nInserted" : 1 })
> db.score.insert({name:"bbb", kor :100, eng:100, mat:76, test:"final"})
WriteResult({ "nInserted" : 1 })
> db.score.insert({name:"ccc", kor :80, eng:55, mat:67, test:"midterm"})
WriteResult({ "nInserted" : 1 })
> db.score.insert({name:"ddd", kor :70, eng:69, mat:89, test:"midterm"})
WriteResult({ "nInserted" : 1 })
> db.score.insert({name:"eee", kor :60, eng:80, mat:78, test:"final"})
WriteResult({ "nInserted" : 1 })
> db.score.insert({name:"fff", kor :100, eng:69, mat:89, test:"midterm"})
WriteResult({ "nInserted" : 1 })
> db.score.insert({name:"ggg", kor :75, eng:100, mat:100, test:"final"})
WriteResult({ "nInserted" : 1 })
> db.score.find()
{ "_id" : ObjectId("60c460855033a1b5fc1e5800"), "name" : "aaa", "kor" : 90, "eng" : 80, "mat" : 98, "test" : "midterm" }
{ "_id" : ObjectId("60c460855033a1b5fc1e5801"), "name" : "bbb", "kor" : 100, "eng" : 100, "mat" : 76, "test" : "final" }
{ "_id" : ObjectId("60c460855033a1b5fc1e5802"), "name" : "ccc", "kor" : 80, "eng" : 55, "mat" : 67, "test" : "midterm" }
{ "_id" : ObjectId("60c460855033a1b5fc1e5803"), "name" : "ddd", "kor" : 70, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c460855033a1b5fc1e5804"), "name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
{ "_id" : ObjectId("60c460855033a1b5fc1e5805"), "name" : "fff", "kor" : 100, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c460875033a1b5fc1e5806"), "name" : "ggg", "kor" : 75, "eng" : 100, "mat" : 100, "test" : "final" }
>
집계 함수
count()
: 컬렉션 내, 문서의 갯수를 조회
distinct()
: 지정된 key에 대한 중복 제거, 컬렉션과 키를 지정해 주어야 함.
sort()
: 정렬, -1을 하면 내림차순
limit()
: 제한하기
Q1) Score의 전체 출력을 해보고 문서의 갯수를 구하자.
db.Score.find();
db.Score.find().count();
> db.Score.find();
{ "_id" : ObjectId("60c2c46d98e69dd9d8688082"), "name" : "aaa", "kor" : 90, "eng" : 80, "mat" : 98, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688083"), "name" : "bbb", "kor" : 100, "eng" : 100, "mat" : 76, "test" : "final" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688084"), "name" : "ccc", "kor" : 80, "eng" : 55, "mat" : 67, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688085"), "name" : "ddd", "kor" : 70, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"), "name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688087"), "name" : "fff", "kor" : 100, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c2c47198e69dd9d8688088"), "name" : "ggg", "kor" : 75, "eng" : 100, "mat" : 100, "test" : "final" }
> db.score.find().count();
7
Q2) Score의 이름과 수학점수만 출력해보자.
db.Score.find({},{name:1, mat:1, _id:0});
> db.Score.find({},{name:1, mat:1, _id:0});
{ "name" : "aaa", "mat" : 98 }
{ "name" : "bbb", "mat" : 76 }
{ "name" : "ccc", "mat" : 67 }
{ "name" : "ddd", "mat" : 89 }
{ "name" : "eee", "mat" : 78 }
{ "name" : "fff", "mat" : 89 }
{ "name" : "ggg", "mat" : 100 }
>
Q3) Score 수학점수 중 70점 이상만 출력해보자.
db.Score.find({mat:{$gte:70}});
db.Score.find({mat:{$gte:70}}).count();
> db.Score.find({mat:{$gte:70}},{_id:0});
{ "name" : "aaa", "kor" : 90, "eng" : 80, "mat" : 98, "test" : "midterm" }
{ "name" : "bbb", "kor" : 100, "eng" : 100, "mat" : 76, "test" : "final" }
{ "name" : "ddd", "kor" : 70, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
{ "name" : "fff", "kor" : 100, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "name" : "ggg", "kor" : 75, "eng" : 100, "mat" : 100, "test" : "final" }
> db.Score.find({mat:{$gte:70}},{_id:0}).count();
6
>
Q4) Score 이름과 국어점수를 출력하되 국어점수가 80점 이상만 출력해보자.
db.Score.find({kor:{$gte:80}},{name:1,kor:1,_id:0});
: 앞이 조건문(where),뒤가 선택문(select)
> db.Score.find({kor:{$gte:80}},{name:1, kor:1,_id:0});
{ "name" : "aaa", "kor" : 90 }
{ "name" : "bbb", "kor" : 100 }
{ "name" : "ccc", "kor" : 80 }
{ "name" : "fff", "kor" : 100 }
>
□ Cursor 반복문
: 몽고 디비에선 특정 조회의 결과 값으로 Cursor를 리턴한다.
하지만 var 키워드로 한 변수로 커서를 할당하지 않으면 결과 갯수만큼 반복문을 통한 결과 값을 출력한다.
Q4-1) Score 이름과 국어점수를 출력하되 국어점수가 80점 이상 추출 해서 합을 구하자.
※ 변수 선언 후 출력 해보기
var sr = db.Score.find({kor:{$gte:80}},{name:1,kor:1,_id:0});
sr; // 변수 리턴 후 소멸
print(sr); // DB 쿼리는 참조하고 있음
sr=null; // null값 지정하면, null 이 된다.
print(sr);
> var sr = db.Score.find({kor:{$gte:80}},{name:1, kor:1,_id:0});
> sr;
{ "name" : "aaa", "kor" : 90 }
{ "name" : "bbb", "kor" : 100 }
{ "name" : "ccc", "kor" : 80 }
{ "name" : "fff", "kor" : 100 }
> print(sr);
DBQuery: my_score.Score -> { "kor" : { "$gte" : 80 } }
> sr = null;
null
> print(sr);
[unknown type]
>
var sr = db.Score.find({kor:{$gte:80}},{name:1,kor:1,_id:0});
var tot = 0;
while(sr.hasNext()){
res = sr.next(); // 지역변수 res
print(res.name + ":" + res.kor);
tot += res.kor;
print ( "tot = " + tot);
};
print ( "나는결과 tot = " + tot);
> var sr = db.Score.find({kor:{$gte:80}},{name:1, kor:1,_id:0});
> var tot = 0;
> while(sr.hasNext()){
// ↖sr.hasNext()는 다음 도큐먼트가 있는지 검사한다. 있으면 true, 없다면 false 반환
... res = sr.next();
// ↖sr.hasNext()가 true 이면 다음 도큐먼트 (sr.next())로 이동
... print (res.name + " : " + res.kor);
... tot += res.kor;
... print ("tot = " + tot);};
aaa : 90
tot = 90
bbb : 100
tot = 190
ccc : 80
tot = 270
fff : 100
tot = 370
> print(" 나는 결과 tot => " + tot);
나는 결과 tot => 370
>
> sr.max()
> sr.min()
> sr.toArray()
[ ]
Q) 4-2 forEach 확인 해보자.
: while문 대신에 forEach 로도 작성 가능하다.
: db.user.find().forEach(function(myDoc){print("user : " + myDoc.name);});
var sr02 = db.Score.find({kor:{$gte:80}},{name:1,kor:1,_id:0});
sr02.forEach(
function(x){
print(x.name + " : " + x.kor);
}
);
// [형식]
// db.user.find().forEach(function(myDoc){print("user : " + myDoc.name);});
> var sr02 = db.Score.find({kor:{$gte:80}},{name:1, kor:1, _id:0});
> sr02.forEach(
... function(x){
... print(x.name + " : " + x.kor);});
aaa : 90
bbb : 100
ccc : 80
fff : 100
>
Q5) test 의 midterm만 출력해보자.
db.Score.find({test:{$eq:"midterm"}},{name:1,test:1,_id:0});
var sm = db.Score.find();
sm.forEach(function(x){
if(x.test == "midterm"){
print(x.name + " : " + x.test);
}});
> db.Score.find({test:{$eq:"midterm"}},{name:1,test:1,_id:0});
{ "name" : "aaa", "test" : "midterm" }
{ "name" : "ccc", "test" : "midterm" }
{ "name" : "ddd", "test" : "midterm" }
{ "name" : "fff", "test" : "midterm" }
> var sm = db.Score.find();
> sm.forEach(function(x){
... if(x.test == "midterm"){
... print(x.name + " : " + x.test);}});
aaa : midterm
ccc : midterm
ddd : midterm
fff : midterm
>
Q6) 이름이 a로 시작되는 이름을 찾아보자.
db.Score.find({name:/^a/});
> db.Score.find({name:/^a/});
{ "_id" : ObjectId("60c2c46d98e69dd9d8688082"),
"name" : "aaa", "kor" : 90, "eng" : 80, "mat" : 98, "test" : "midterm" }
Q6-1)이름이 a로 시작되거나 e로 시작되는 문서를 찾아보자.
db.Score.find({$or:[{name:/^a/},{name:/^e/}]});
> db.Score.find({$or:[{name:/^a/},{name:/^e/}]});
{ "_id" : ObjectId("60c2c46d98e69dd9d8688082"),
"name" : "aaa", "kor" : 90, "eng" : 80, "mat" : 98, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"),
"name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
Q7) Score에서 test가 m으로 시작하는 문서의 갯수를 구하자.
db.Score.find({test:/^m/}).count();
> db.Score.find({test:/^m/}).count();
4
Q8) 이름을 출력하되 중복되지 않게 출력하자.
: distinct(필드, 쿼리)
db.Score.distinct("name");
db.Score.distinct("test");
> db.Score.distinct("name");
[ "aaa", "bbb", "ccc", "ddd", "eee", "fff", "ggg" ]
> db.Score.distinct("test");
[ "final", "midterm" ]
>
Q9) 영어점수가 80점 이상인 학생의 이름을 출력해보자. 단 이름은 중복되지 않게 출력해보자.
db.Score.distinct("name",{eng:{$gte:80}});
> db.Score.distinct("name",{eng:{$gte:80}});
[ "aaa", "bbb", "eee", "ggg" ]
>
Q10) next() 메소드를 사용하자 .docs
var myCursor = db.Score.find( );
var myDocument = myCursor.hasNext() ? myCursor.next() : null;
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
};
myCursor.hasNext()는 다음 도큐먼트가 있는지 검사한다. 있으면 true, 없다면 false 반환
myCursor.hasNext()가 true 이면 다음 도큐먼트 (myCursor.next())로 이동하고
없으면 null을 변수 myDocument에 저장한다.
> var myCursor = db.Score.find( );
> var myDocument = myCursor.hasNext() ? myCursor.next() : null;
> if (myDocument) {
... var myName = myDocument.name;
... print (tojson(myName));
... };
"aaa"
>
if (myDocument) {
var myName = myDocument.name;
printjson(myName);
};
> if(myDocument){
... var myName = myDocument.name;
... printjson(myName);};
"aaa"
>
var myCursor = db.Score.find( );
myCursor.forEach(printjson);
: while 문 처럼 반복해 출력된다.
> var myCursor = db.Score.find();
> myCursor.forEach(printjson);
{
"_id" : ObjectId("60c2c46d98e69dd9d8688082"),
"name" : "aaa",
"kor" : 90,
"eng" : 80,
"mat" : 98,
"test" : "midterm"
}
{
"_id" : ObjectId("60c2c46e98e69dd9d8688083"),
"name" : "bbb",
"kor" : 100,
"eng" : 100,
"mat" : 76,
"test" : "final"
}
{
"_id" : ObjectId("60c2c46e98e69dd9d8688084"),
"name" : "ccc",
"kor" : 80,
"eng" : 55,
"mat" : 67,
"test" : "midterm"
}
{
"_id" : ObjectId("60c2c46e98e69dd9d8688085"),
"name" : "ddd",
"kor" : 70,
"eng" : 69,
"mat" : 89,
"test" : "midterm"
}
{
"_id" : ObjectId("60c2c46e98e69dd9d8688086"),
"name" : "eee",
"kor" : 60,
"eng" : 80,
"mat" : 78,
"test" : "final"
}
{
"_id" : ObjectId("60c2c46e98e69dd9d8688087"),
"name" : "fff",
"kor" : 100,
"eng" : 69,
"mat" : 89,
"test" : "midterm"
}
{
"_id" : ObjectId("60c2c47198e69dd9d8688088"),
"name" : "ggg",
"kor" : 75,
"eng" : 100,
"mat" : 100,
"test" : "final"
}
>
var m = db.Score.find({},{name:1,_id:0});
m.forEach(printjson);
> var m = db.Score.find({},{name:1, _id:0});
> m.forEach(printjson);
{ "name" : "aaa" }
{ "name" : "bbb" }
{ "name" : "ccc" }
{ "name" : "ddd" }
{ "name" : "eee" }
{ "name" : "fff" }
{ "name" : "ggg" }
>
Q11) test를 출력하 되 이름을 오름차순으로 정렬해보자.
db.Score.find({},{"name":1, "test":1}).sort({"name":1});
db.Score.find({},{"name":1, "test":1}).sort({"name":-1}); / 내림차순
> db.Score.find({},{name:1, test:1}).sort({name:1});
{ "_id" : ObjectId("60c2c46d98e69dd9d8688082"), "name" : "aaa", "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688083"), "name" : "bbb", "test" : "final" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688084"), "name" : "ccc", "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688085"), "name" : "ddd", "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"), "name" : "eee", "test" : "final" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688087"), "name" : "fff", "test" : "midterm" }
{ "_id" : ObjectId("60c2c47198e69dd9d8688088"), "name" : "ggg", "test" : "final" }
> db.Score.find({},{name:1, test:1}).sort({name:-1});
{ "_id" : ObjectId("60c2c47198e69dd9d8688088"), "name" : "ggg", "test" : "final" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688087"), "name" : "fff", "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"), "name" : "eee", "test" : "final" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688085"), "name" : "ddd", "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688084"), "name" : "ccc", "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688083"), "name" : "bbb", "test" : "final" }
{ "_id" : ObjectId("60c2c46d98e69dd9d8688082"), "name" : "aaa", "test" : "midterm" }
>
□ 최대값, 최소값 sort()+limit()
Q12) 영어 점수가 가장 높은 문서를 출력하자.
db.Score.find({}).sort({eng:-1}).limit(1);
> db.Score.find({}).sort({eng:-1}).limit(1);
{ "_id" : ObjectId("60c2c46e98e69dd9d8688083"),
"name" : "bbb", "kor" : 100, "eng" : 100, "mat" : 76, "test" : "final" }
Q13) 국어점수가 가장 낮은 문서를 출력하자.
db.Score.find({}).sort({kor:1}).limit(1);
> db.Score.find({}).sort({kor:1}).limit(1);
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"),
"name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
>
Q14) 5개의 문서 중에서 2개를 건너띄고 3 줄만 출력 해라
db.Score.find({}).limit(3).skip(2);
> db.Score.find({}).limit(3).skip(2);
{ "_id" : ObjectId("60c2c46e98e69dd9d8688084"),
"name" : "ccc", "kor" : 80, "eng" : 55, "mat" : 67, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688085"),
"name" : "ddd", "kor" : 70, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"),
"name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
>
Q15) 5개의 문서 중에서 2개를 건너띄고 3줄만 출력해라, 단 수학점수를 내림차순으로 출력하자.
db.Score.find({}).limit(3).skip(2).sort({mat:-1});
> db.Score.find({}).limit(3).skip(2).sort({mat:-1});
{ "_id" : ObjectId("60c2c46e98e69dd9d8688087"),
"name" : "fff", "kor" : 100, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688085"),
"name" : "ddd", "kor" : 70, "eng" : 69, "mat" : 89, "test" : "midterm" }
{ "_id" : ObjectId("60c2c46e98e69dd9d8688086"),
"name" : "eee", "kor" : 60, "eng" : 80, "mat" : 78, "test" : "final" }
>
SQL 과 MONGODB 비교
WHERE $match
GROUP BY $group
HAVING $match
SELECT $project
ORDER BY $sort
LIMIT $limit
SUM() $sum
COUNT() $sum $sortByCount
join $lookup
SELECT INTO NEW_TABLE $out
MERGE INTO TABLE $merge (Available starting in MongoDB 4.2)
UNION ALL $unionWith (Available starting in MongoDB 4.4)
몽고DB에서 집계처리하는 방법
1. Aggregation 프레임워크
sql 사용하는 group by 절과 sum 등으로 이루어진다.
MongoShell에서 쿼리와 같은 방법으로 사용된다.
일부처리 ($group 과 $sort)는 샤드에 대응하고, 각 샤드에서 처리한다.
2. Map/Redece 기능
Map함수 Reduce 함수를 정의해서 집계 처리한다.
Aggregation 프레임워크에서 할 수 없는 복잡한 집계 작업을 수행 하는데 사용한다.
샤드에 대응하고 있기 때문에 분산 처리를 실시하는 것이 가능하다.
3. 기타집계처리, 미들과의 연계 (하둡)
더 큰 규모로 집계 처리를 하기 때문에 다른 집계 처리 미들웨어 시스템과의 연계를 해야한다.
미들웨어(middleware) = 분산환경 + 네트워크 통신 + 응용프로그램과의 연계
Q16) 아래 데이터 입력후 확인.find()
db.Product.save({Name:"notebook", Price:200, Category : "material"});
db.Product.save({Name:"pencil", Price:80, Category : "material"});
db.Product.save({Name:"salad", Price:220, Category : "food"});
db.Product.save({Name:"others", Price:20, Category : "material"});
db.Product.save({Name:"bread", Price:100, Category : "food"});
> db.Product.find();
{ "_id" : ObjectId("60c3064598e69dd9d8688089"), "Name" : "notebook", "Price" : 200, "Category" : "material" }
{ "_id" : ObjectId("60c3064598e69dd9d868808a"), "Name" : "pencil", "Price" : 80, "Category" : "material" }
{ "_id" : ObjectId("60c3064598e69dd9d868808b"), "Name" : "salad", "Price" : 220, "Category" : "food" }
{ "_id" : ObjectId("60c3064598e69dd9d868808c"), "Name" : "others", "Price" : 20, "Category" : "material" }
{ "_id" : ObjectId("60c3064698e69dd9d868808d"), "Name" : "bread", "Price" : 100, "Category" : "food" }
Q17) 맵리듀스를 활용해서 집계를 구현해 보자.
컬렉션의 카테고리별로 (group by) 목록의 개수와 가격의 합을 구해보자.
map : 특정 collection의 특정 key와 value를 map으로 하며, map의 key는 중복이 안되며 value는 list에 쌓이는 형태
reduce : map의 데이터를 감소시키는 역할, 특정 값을 뽀ㅃ아내고 통계치 데이터로 사용
<참고>
db.Product.help()
db.Product.mapReduce( mapFunction , reduceFunction , <optional params> )
1. mapFunction : emit를 매개인자로 집계할 key, value 값을 지정한다.
function mymap (){
emit (this.Category, {Category: this.Category, Count : 1, Amount : this.Price}
)
};
# emit 추출하다. ( key, value)
# this.Category : key, Category 이하 : value
2. reduceFunction : 집계를 구한다.
function myreduce (key,values){
var result = {Category : key, Count:0, Amount:0}
values.forEach (function (v) {
result.Count += v.Count;
result.Amount += v.Amount;
});
return result;
};
# function (변수, 변수) = myreduce( 변수, 변수)
3. <optional params>
db.Product.mapReduce(mymap, myreduce, {out:{replace:"myResult"}});
db.myResult.find();
> function mymap (){
... emit (this.Category, {Category: this.Category, Count : 1, Amount : this.Price}
... )
... };
> function myreduce (key,values){
... var result = {Category : key, Count:0, Amount:0}
... values.forEach (function (v) {
... result.Count += v.Count;
... result.Amount += v.Amount;
... });
... return result;
... };
> db.Product.mapReduce(mymap, myreduce, {out:{replace:"myResult"}});
{ "result" : "myResult", "ok" : 1 }
> db.myResult.find();
{ "_id" : "food", "value" : { "Category" : "food", "Count" : 2, "Amount" : 320 } }
{ "_id" : "material", "value" : { "Category" : "material", "Count" : 3, "Amount" : 300 } }
>
Q18) Score 컬렉션에서 test를 그룹화해서 개수를 구하자. (mr) myResult02
1.
function m_map(){
emit(this.test,{test:this.test, Count:1})
};
2.
function m_reduce(k,v){
var r = {test : k, Count : 0}
v.forEach(function(v){
r.Count += v.Count;});
return r};
3.
db.Score.mapReduce(m_map, m_reduce, {out: {replace:"myResult2"}});
db.myResult2.find();
Q19) test 그룹화해서 국어점수 합계, 수학은 평균을 구하자. myResult03
1.
function m_map(){
emit (this.test, {test:this.test, kor : this.kor, mat : this.mat, cnt:1})};
2.
function m_reduce(key, value) {
var result = {test: key, kor_sum : 0, mat_sum : 0 , cnt : 0}
value.forEach (function(v) {
result.kor_sum += v.kor;
result.mat_sum += v.mat;
result.cnt += v.cnt;})
return result;
};
var m_avg = function (key, m_reduce) {
m_reduce.avg = m_reduce.mat_sum/m_reduce.cnt;
return m_reduce ;};
3.
db.Score.mapReduce(m_map, m_reduce, {out:{replace:"myResult03"}, finalize:m_avg});
db.myResult03.find();
> function m_map(){
...
... emit (this.test, {test:this.test, kor : this.kor, mat : this.mat, cnt:1})};
> function m_reduce(key, value) {
... var result = {test: key, kor_sum : 0, mat_sum : 0 , cnt : 0}
... value.forEach (function(v) {
... result.kor_sum += v.kor;
... result.mat_sum += v.mat;
... result.cnt += v.cnt;})
...
... return result;
... };
> var m_avg = function (key, m_reduce) {
...
... m_reduce.avg = m_reduce.mat_sum/m_reduce.cnt;
...
... return m_reduce ;};
> db.Score.mapReduce(m_map, m_reduce, {out:{replace:"myResult03"}, finalize:m_avg});
{ "result" : "myResult03", "ok" : 1 }
> db.myResult03.find();
{ "_id" : "final", "value" : { "test" : "final", "kor_sum" : 235, "mat_sum" : 254, "cnt" : 3, "avg" : 84.66666666666667 } }
{ "_id" : "midterm", "value" : { "test" : "midterm", "kor_sum" : 340, "mat_sum" : 343, "cnt" : 4, "avg" : 85.75 } }
'|Playdata_study > mongoDB' 카테고리의 다른 글
210616_mongoDB5 (0) | 2021.06.17 |
---|---|
210615_mongoDB4 (0) | 2021.06.15 |
210614_mongoDB3 (0) | 2021.06.14 |
210610_mongoDB (0) | 2021.06.10 |
댓글