12

私はmongooseを使用してnodejs + mongodbプロジェクトに取り組んでいます。今、答えがわからない問題に出くわしました。グループ化された結果を取得するために集計フレームワークを使用しています。グループ化は、「2013 02 06」のような時間データ フィールドを除く日付で行われます。コードは次のようになります。

MyModel.aggregate([
            {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}},
            {$group: {
                _id: {
                    year: {$year: "$created_at"},
                    month: {$month: "$created_at"},
                    day: {$dayOfMonth: "$created_at"}
                },
                count: {$sum: 1}
            }},
            {$project: {
                date: {
                        year: "$_id.year",
                        month:"$_id.month",
                        day:"$_id.day"
                },
                count: 1,
                _id: 0
            }}
        ], callback);

グループ化された結果は、ソートされていないことを除けば完璧です。出力の例を次に示します。

[
    {
        count: 1,
        date: {
            year: 2013,
            month: 2,
            day: 7
        }
    },
    {
        count: 1906,
        date: {
            year: 2013,
            month: 2,
            day: 4
        }
    },
    {
        count: 1580,
        date: {
            year: 2013,
            month: 2,
            day: 5
        }
    },
    {
        count: 640,
        date: {
            year: 2013,
            month: 2,
            day: 6
        }
    }
]

これを追加することでソートが行われることを私は知っています: {$sort: val}. しかし、今はどうあるべきかわからないvalので、グループ化キーは日付を構成する3つの値のオブジェクトであるため、結果は日付でソートされます。これをどのように達成できるか知っている人はいますか?

編集 これを試してみましたが、うまくいきました:)

{$sort: {"date.year":1, "date.month":1, "date.day":1}}

4

3 に答える 3

11

この質問には非常に簡単な答えがあるようです:)次のように複数のネストされた列でソートするだけです:

{$sort: {"date.year":1, "date.month":1, "date.day":1}}
于 2013-02-08T16:33:46.400 に答える
5

私は同じ問題で立ち往生しました、あなたの答えに感謝します。しかし、より少ないコードで同じ結果が得られることがわかりました

MyModel.aggregate([
            {$match: {$and: [{created_date: {$gte: start_date}}, {created_date: {$lte: end_date}}]}},
            {$group: {
                _id: {
                    year: {$year: "$created_at"},
                    month: {$month: "$created_at"},
                    day: {$dayOfMonth: "$created_at"}
                },
                count: {$sum: 1}
            }},
            {$project: {
                date: "$_id", // so this is the shorter way
                count: 1,
                _id: 0
            }},
            {$sort: {"date": 1} } // and this will sort based on your date
        ], callback);
于 2014-05-29T20:20:09.837 に答える
-1

これは、ソートする他の列がある場合にのみ日付でソートする場合に機能します。_id を展開する必要があります

于 2015-08-14T19:24:20.153 に答える