5

新しい集計フレームワークを使用して、次の SQL に似たステートメントを mongo-query に変換しようとしています。

SELECT * FROM ...
GROUP BY class

これまでのところ、次のように書くことができましたが、これはうまく機能しますが、選択/返されるフィールドは 1 つだけです。

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

また、MongoDb をだましてすべてのフィールドを返すために、存在しないフィールド名を追加することで、$project パイプラインの除外モードを試してみました。構文は正しいですが、結果は返されません。例えば:

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 : "$クラス"
        ,field2: {$push: "$field2"}
        ,field3: {$push: "$field3"}
        ,field4: {$push: "$field4"}
}}, $sort{field2:-1})`

上記は試していませんが、以下はうまくいきます。

オプション2

    `db.StudentMarks.aggregate(
{
    { $グループ: {
        _id : "$クラス"
        ,field2: {$push: "$field2"}
        ,field3: {$push: "$field3"}
        ,field4: {$push: "$field4"}
}}, $sort{field2:-1})`

結果

    `{
        "結果" : [
                {
                        "_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
                        ]
                }
        ]、
        「わかりました」:1
}`
于 2013-07-18T17:14:42.610 に答える