sql >> データベース >  >> NoSQL >> MongoDB

group byで集計し、正しく並べ替える方法

    ここで理解すべきいくつかの落とし穴があります。

    $ groupを使用する場合 境界は、初期段階または終了段階なしで検出された順序で並べ替えられます $ sort 手術。したがって、ドキュメントが元々次のような順序であった場合:

    { uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
    { uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
    { uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
    { uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
    

    次に、 $ groupを使用します。 $ sortなし パイプラインの最後では、次のような結果が返されます:

    { uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
    { uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
    { uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
    

    これは1つの概念ですが、実際には、結果に期待しているのは、 uidの並べ替えられた順序で「最後の他のフィールド」を返す必要があるようです。 あなたが探しているものです。その場合、結果を得る方法は実際には $ sortです。 最初に $last<を利用します/ code> 演算子:

    db.mycollection.aggregate([
    
        // Sorts everything first by _id and created
        { "$sort": { "_id": 1, "created": 1 } },
    
        // Group with the $last results from each boundary
        { "$group": {
            "_id": "$uid",
            "created": { "$last": "$created" },
            "another_col": { "$last": "$created" }
        }}
    ])
    

    または、基本的に必要なものに並べ替えを適用します。

    $ lastの違い および $ max 後者は、グループ化 _id内の指定されたフィールドの「最高」値を選択するということです。 、ソートされていない順序で現在ソートされているかどうかに関係なく。一方、 $ last > 「最後の」グループ化_idと同じ「行」にある値を選択します 価値。

    実際に配列の値を並べ替えようとしている場合、アプローチは似ています。配列メンバーを「作成された」順序に保つと、最初に並べ替えることもできます:

    db.mycollection.aggregate([
    
        // Sorts everything first by _id and created
        { "$sort": { "_id": 1, "created": 1 } },
    
        // Group with the $last results from each boundary
        { "$group": {
            "_id": "$uid",
            "row": {
                "$push": {
                    "created": "$created",
                    "another_col": "$another_col"
                }
            }
        }}
    ])
    

    そして、それらのフィールドを持つドキュメントは、すでに並べ替えられた順序で配列に追加されます。



    1. idと呼ばれるフィールドに対するMongoDBLINQプロバイダーの奇妙な動作

    2. JAVAからMongoSSLレプリカセットに接続できません

    3. SpringDataMongoが列挙型のPersistentEntityを見つけることができません

    4. GridFSを使用して保存され、React / JavascriptクライアントでGraphQLを使用して返されるファイルをダウンロードするにはどうすればよいですか?