我的汇总存在一些问题。我有大量具有以下架构的平面文档:
{
_id:ObjectId("5dc027d38da295b969eca568"),
emp_no:10001,
salary:60117,
from_date:"1986-06-26",
to_date:"1987-06-26"
}
这与雇员的年薪有关。数据是从关系数据库导出的,因此存在多个具有相同“ emp_no” 值的文档,但是它们的其余属性有所不同。我需要通过属性“ emp_no”的值来聚合它们,因此结果是:
//one document
{
_id:ObjectId("5dc027d38da295b969eca568"),
emp_no:10001,
salaries: [
{
salary:60117,
from_date:"1986-06-26",
to_date:"1987-06-26"
},
{
salary:62102,
from_date:"1987-06-26",
to_date:"1988-06-25"
},
...
]
}
//another document
{
_id:ObjectId("5dc027d38da295b969eca579"),
emp_no:10002,
salaries: [
{
salary:65828,
from_date:"1996-08-03",
to_date:"1997-08-03"
},
...
]
}
//and so on
最后但并非最不重要的一点是,几乎有290万个文档,因此手动通过“ emp_no” 进行汇总会有些问题。
有什么方法可以仅使用mongo查询将它们聚合?我该怎么做?预先感谢您的帮助
答案 0 :(得分:0)
聚合管道的组阶段可用于获取这种类型的聚合。在分组阶段中,将要分组的属性指定为_id
字段的值。
以下查询如何为您工作?
db.collection.aggregate([
{
"$group": {
"_id": "$emp_no",
"salaries": {
"$push": {
"salary": "$salary",
"from_data": "$from_date",
"to_data": "$to_date"
}
},
"emp_no": {
"$first": "$emp_no"
},
"first_document_id": {
"$first": "$_id"
}
}
},
{
"$project": {
"_id": "$first_document_id",
"salaries": 1,
"emp_no": 1
}
}
])