我正在尝试使用新的aggregation framework将以下类似SQL的语句转换为mongo-query。
SELECT * FROM ...
GROUP BY class
到目前为止,我已设法编写以下内容,但效果很好 - 但只选择/返回了一个字段。
db.studentMarks.aggregate(
{
$project: {
class : 1 // Inclusion mode
}
},
{
$group: {
_id: "$class"
}
}
);
我还尝试使用$ project pipelines exclusion mode,添加一个从不存在的字段名称,以欺骗MongoDb返回所有字段。虽然语法正确,但不返回任何结果。 E.g:
db.studentMarks.aggregate(
{
$project: {
noneExistingField : 0 // Exclusion mode...
// Attempt to trick mongo into returning all fields
// sadly this fails - empty array is returned.
}
},
{
$group: {
_id: "$class"
}
}
);
我之所以需要返回所有字段,是因为我不知道(将来)将会出现哪些字段。例如。 “学生”可能有x,y,z字段。因此,我需要“全选”,将结果按单个字段分组并返回,为了通用目的 - 不必是“学生标记”,可以是任何类型的数据集,而不知道所有字段。
出于上述原因,我不能简单地预测所有必须返回的字段 - 再次 - 因为我不会知道所有字段。
我希望有人知道使用新聚合框架解决问题的好方法。
答案 0 :(得分:1)
只是不要在管道中使用项目操作员。
db.studentMarks.aggregate({
$group: { _id: "$class" }
});
答案 1 :(得分:0)
您可以尝试将每个字段按组推送到数组。
请尝试以下。
`db.StudentMarks.aggregate( { $project: { class : 1 // Inclusion mode } }, { $group : { _id : "$class" ,field2: {$push: "$field2"} ,field3: {$push: "$field3"} ,field4: {$push: "$field4"} }}, $sort{field2:-1})`
我上面没有尝试过,但下面对我有用。
`db.StudentMarks.aggregate( { { $group : { _id : "$class" ,field2: {$push: "$field2"} ,field3: {$push: "$field3"} ,field4: {$push: "$field4"} }}, $sort{field2:-1})`
结果
`{ "result" : [ { "_id" : 59, "field2" : [ 59, 59, 59 ], "field3" : [ ObjectId("51e7072086eretetterr0001"), ObjectId("51e7076786cb343453535354"), ObjectId("51e716598435353534345335") ], "field4" : [ 11111, 11111, 11111 ] }, { "_id" : 58, "field2" : [ 58, 58, 58, 58, 58 ], "field3" : [ ObjectId("51e469ad3843534535353535"), ObjectId("51e7178f86cb349845667775"), ObjectId("51e71df286cb349842456gtg"), ObjectId("51e71ea686cb345646466466"), ObjectId("51e71eac86cb346546464646") ], "field4" : [ 11111, 11111, 11111, 11111, 11111 ] } ], "ok" : 1 }`