MongoDB의 집계 프레임 워크를 사용하여이를 수행 할 수 있습니다. 실시간으로 최신으로 유지하기 위해, 당신이해야 할 것은 다음이다 :
- 프로젝트 현재 날짜로부터 출생 (
dob
)의 날짜를 차감하여 ageMillis
필드. 연령 값은 밀리 초 단위로 표시됩니다.
ageMillis
을 1 년 (자바 스크립트의 경우 31536000000)으로 나누고 ageDecimal
필드에 투영하십시오. 이 연령에 그룹화하려면 십진법을 사용하고 싶지 않습니다.
ageDecimal
필드와 십진수 부분을 포함하는 decimal
필드를 투영하십시오. $mod
연산자를 사용하여이 작업을 수행 할 수 있습니다.
decimal
에서 ageDecimal
을 뺀 다음 age
필드로 투사하십시오. 이것은 당신에게 년의 나이 값을 제공합니다.
- 그룹
age
필드로 그룹화하고 $sum
을 사용하여 카운트를 추적하십시오. 기본적으로 그 나이에 볼 수있는 모든 문서에 대해 1을 더합니다.
- 필요한 경우
age
필드로 정렬하십시오.
셸의 명령은 아래 명령과 같습니다. JavaScript의 Date()
개체를 사용하여 현재 날짜를 가져옵니다. Ruby에서이 작업을 수행하려면 해당 코드를 변경하고 나머지는 Ruby 드라이버의 구문을 따라야합니다.
db.collection.aggregate([
{ "$project" :
{
"ageMillis" : { "$subtract" : [ new Date(), "$dob" ]}
}
},
{ "$project" :
{
"ageDecimal" : { "$divide" : [ "$ageMillis", 31536000000 ]}
}
},
{ "$project" :
{
"ageDecimal" : "$ageDecimal",
"decimal" : { "$mod" : [ "$ageDecimal", 1 ]}
}
},
{ "$project" :
{
"age" : { "$subtract" : [ "$ageDecimal", "$decimal" ]}
}
},
{ "$group" :
{
"_id" : { "age" : "$age" },
"count" : { "$sum" : 1 }
}
},
{ "$sort" :
{
"_id.age" : 1
}
}
]);
이렇게하면 원하는 결과를 얻을 수 있습니다. aggregate()
메서드는 커서를 반환합니다. 결과를 얻기 위해 반복해야합니다.
지도를 사용하고 싶습니다./여기에서 줄이십시오. 집계 프레임 워크에는 공개 티켓이 있지만 아직 해결되지 않았습니다. – kwolfe
사람 문서는 어떻게 보이나요? 그 사람의 나이가있는 분야가 있습니까? 그리고이 사람들 모두가 하나의 컬렉션에 있다고 가정합니다. –
@JuanCarlosFarah Sorta, 모든 사람들이 데이트 필드로 생년월일을 가진 콜렉션에 있습니다. – Hans