我在将聚类应用于聚合分组时遇到问题。我的原始数据如下所示:
{
"_id" : ObjectId("52deab2fe4b0a491abb54108"),
"type" : "build",
"time" : ISODate("2014-01-21T17:15:27.471Z"),
"data" : {
"buildNumber" : 43,
"buildDuration" : 997308,
"buildProjectName" : "TestABC",
"buildResult" : "SUCCESS"
}
}
我想首先通过buildProjectName然后将日期排序。这是我的疑问:
db.builds.aggregate([
{ $group: {
_id: {
month: { $month: "$time" },
day: { $dayOfYear: "$time" },
year: { $year: "$time" },
buildProjectName: "$data.buildProjectName",
},
buildDuration: { $avg: "$data.buildDuration" }
} },
{ $sort: {buildProjectName: 1, year: 1, month: 1, day: 1} }
])
我已经尝试切换排序顺序(即:buildProjectName,日,月,年),但我总是得到与日期不按顺序相同的结果:
{
"result" : [
{
"_id" : {
"month" : 1,
"day" : 20,
"year" : 2014,
"buildProjectName" : "TestABC"
},
"buildDuration" : 1170723.5
},
{
"_id" : {
"month" : 1,
"day" : 21,
"year" : 2014,
"buildProjectName" : "TestABC"
},
"buildDuration" : 2284863.3333333335
},
{
"_id" : {
"month" : 1,
"day" : 17,
"year" : 2014,
"buildProjectName" : "TestABC"
},
"buildDuration" : 2234662
}
],
"ok" : 1
}
答案 0 :(得分:27)
您要排序的字段是_id
的一部分,因此您需要将其包含在$sort
字段名称中:
db.builds.aggregate([
{ $group: {
_id: {
month: { $month: "$time" },
day: { $dayOfYear: "$time" },
year: { $year: "$time" },
buildProjectName: "$data.buildProjectName",
},
buildDuration: { $avg: "$data.buildDuration" }
} },
{ $sort: {
'_id.buildProjectName': 1,
'_id.year': 1,
'_id.month': 1,
'_id.day': 1
} }
])
答案 1 :(得分:0)
所以这是对聚合结果进行排序的问题。
这里,您要排序的字段是ID的一部分,因此基本上,您的聚合操作将执行平均值操作,并返回带有2个称为“ _id”和“ buildDuration”的文件的结果集,因为您正在对字段进行排序在“ _id”的内部字段中,您必须按照以下方式定义“排序”属性。
{ $sort: {
'_id.buildProjectName': 1,
'_id.year': 1,
'_id.month': 1,
'_id.day': 1
} }
希望这会对您有所帮助。如有任何疑问,请与我联系。