5

我正在尝试使用新的聚合框架将以下类似 SQL 的语句转换为 mongo-query 。

SELECT * FROM ...
GROUP BY class

到目前为止,我已经设法编写了以下内容,效果很好 - 但只选择/返回了一个字段。

db.studentMarks.aggregate(
   {
     $project: {
        class : 1 // Inclusion mode
     }
   },
   {
     $group: {
        _id: "$class"
     }
   }
);

我还尝试使用 $project pipelines exclude mode,通过添加一个从不存在的字段名称,以欺骗 MongoDb 返回所有字段。虽然语法正确,但不返回任何结果。例如:

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 或没有。因此,出于一般目的,我需要“全选”,将结果按单个字段分组并返回 - 不必用于“学生标记”,可以用于任何类型的数据集,而不知道所有字段。

由于上述原因,我不能简单地预测所有必须返回的字段 - 再一次 - 因为我不会知道所有字段。

我希望有人知道使用新的聚合框架解决我的问题的好方法。

4

2 回答 2

1

根本不要在管道中使用项目运算符。

db.studentMarks.aggregate({
  $group: { _id: "$class" }
});
于 2012-05-31T18:07:26.773 回答
0

您可以尝试按所有字段分组,将每个字段推送到数组。

下面试试。

选项1

    `db.StudentMarks.aggregate(
{
     $项目:{
        class : 1 // 包含模式
     }
   },
{ $组:{
        _id : "$class"
        ,field2: {$push: "$field2"}
        ,field3: {$push: "$field3"}
        ,field4: {$push: "$field4"}
}}, $sort{field2:-1})`

我没有在上面尝试过,但下面对我有用。

选项2

    `db.StudentMarks.aggregate(
{
    { $组:{
        _id : "$class"
        ,field2: {$push: "$field2"}
        ,field3: {$push: "$field3"}
        ,field4: {$push: "$field4"}
}}, $sort{field2:-1})`

结果

    `{
        “结果” : [
                {
                        “_id”:59,
                        “字段2”:[
                                59,
                                59,
                                59
                        ],
                        “字段3”:[
                                ObjectId("51e7072086eretetterr0001"),
                                ObjectId("51e7076786cb343453535354"),
                                ObjectId("51e716598435353534345335")
                        ],
                        “字段4”:[
                                11111,
                                11111,
                                11111
                        ]
                },
                {
                        “_id”:58,
                        “字段2”:[
                                58,
                                58,
                                58,
                                58,
                                58
                        ],
                        “字段3”:[
                                ObjectId("51e469ad3843534535353535"),
                                ObjectId("51e7178f86cb349845667775"),
                                ObjectId("51e71df286cb349842456gtg"),
                                ObjectId("51e71ea686cb345646466466"),
                                ObjectId("51e71eac86cb346546464646")
                        ],
                        “字段4”:[
                                11111,
                                11111,
                                11111,
                                11111,
                                11111
                        ]
                }
        ],
        “好”:1
}`
于 2013-07-18T17:14:42.610 回答