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

最大配列フィールドによる並べ替え、昇順または降順

    ここで質問していることの基本的な問題は、問題のデータが「配列」内にあるという事実に帰着します。したがって、これがどのように処理されるかについて、MongoDBによっていくつかの基本的な仮定があります。

    「降順」で並べ替えを適用した場合、MongoDBは要求どおりに実行し、配列内の指定されたフィールドの「最大」値でドキュメントを並べ替えます。

    .sort({ "revisions.created": -1 ))
    

    ただし、代わりに「昇順」で並べ替えると、もちろんその逆になり、「最小」の値が考慮されます。

    .sort({ "revisions.created": 1 })
    

    したがって、これを行う唯一の方法は、配列内のデータから最大の日付を計算し、その結果で並べ替えることを意味します。これは基本的に.aggregate()を適用することを意味します 、meteorの場合はサーバー側の操作ですが、残念ながら次のようになります。

    Collection.aggregate([
        { "$unwind": "$revisions" },
        { "$group": {
            "_id": "$_id",
            "name": { "$first": "$name" },
            "revisions": { "$push": "$revisions" },
            "number": { "$first": "$number" }
            "maxDate": { "$max": "$revisions.created" }
        }},
        { "$sort": { "maxDate": 1 }
    ])
    

    または、せいぜいMongoDB 3.2で、$max 配列式に直接適用できます:

    Collection.aggregate([
        { "$project": {
            "name": 1,
            "revisions": 1,
            "number": 1,
            "maxDate": {
                "$max": {
                    "$map": {
                        "input": "$revisions",
                        "as": "el",
                        "in": "$$el.created"
                    }
                }
            }
        }},
        { "$sort": { "maxDate": 1 } }
    ])
    

    しかし、実際には両方ともそれほど優れていません。MongoDB3.2アプローチのオーバーヘッドが以前のバージョンよりもはるかに少ない場合でも、データをパススルーして作業する必要があるため、パフォーマンスの点で得られるほど良くはありません。並べ替える値を取り出します。

    したがって、最高の パフォーマンス、「常に」、アレイの「外部」で必要になるようなデータを保持します。このために$maxがあります 「更新」演算子。提供された値が既存の値より「大きい」場合にのみ、ドキュメント内の値を置き換えます。つまり:

    Collection.update(
        { "_id": "qTF8kEphNoB3eTNRA" },
        { 
            "$push": {
                "revisions": { "created": new Date("2016-02-01") }            
            },
            "$max": { "maxDate": new Date("2016-02-01") }
        }
    )
    

    つまり、必要な値は「常に」期待値とともにドキュメント内に存在するため、そのフィールドで並べ替えるだけで済みます。

    .sort({ "maxDate": 1 })
    

    だから私のお金のために、私は.aggregate()のいずれかで既存のデータを調べます ステートメントが利用可能であり、それらの結果を使用して、「maxDate」フィールドを含むように各ドキュメントを更新します。次に、配列データのすべての追加と改訂のコーディングを変更して、その$maxを適用します。 変更のたびに「更新」します。

    十分な頻度で使用している場合は、計算ではなくソリッドフィールドを使用する方が常に理にかなっています。そして、メンテナンスは非常に簡単です。

    いずれにせよ、上記の適用例の日付を考慮すると、現在の他の最大日付よりも「少ない」ので、すべての形式で返されます。

    {
            "_id" : "5xF9iDTj3reLDKNHh",
            "name" : "Lorem ipsum",
            "revisions" : [
                    {
                            "number" : 0,
                            "comment" : "Dolor sit amet",
                            "created" : ISODate("2016-02-11T01:22:45.588Z")
                    }
            ],
            "number" : 1,
            "maxDate" : ISODate("2016-02-11T01:22:45.588Z")
    }
    {
            "_id" : "qTF8kEphNoB3eTNRA",
            "name" : "Consecitur quinam",
            "revisions" : [
                    {
                            "comment" : "Hoste ad poderiquem",
                            "number" : 1,
                            "created" : ISODate("2016-02-11T23:25:46.033Z")
                    },
                    {
                            "number" : 0,
                            "comment" : "Fagor questibilus",
                            "created" : ISODate("2016-02-11T01:22:45.588Z")
                    },
                    {
                            "created" : ISODate("2016-02-01T00:00:00Z")
                    }
            ],
            "number" : 2,
            "maxDate" : ISODate("2016-02-11T23:25:46.033Z")
    }
    

    これは、「maxDate」を考慮して、最初のドキュメントを並べ替え順序の一番上に正しく配置します。




    1. MongoDBの関係:埋め込みまたは参照?

    2. Mongodbconcatintおよびstring

    3. Mongodbは集約フレームワークについて説明します

    4. MongoDB正規表現検索-javascriptドライバーとNodeJSの使用から始まります