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

mongodbの集計を使用して、最大値を持つすべてのドキュメントを取得します

    ドキュメント情報を保持したい場合は、基本的に $ push それを配列に入れます。ただし、もちろん、 $ max 値の場合、一致する要素のみについて配列の内容をフィルタリングする必要があります:

    db.coll.aggregate([
        { "$group":{ 
            "_id": "$country",
            "maxQuantity": { "$max": "$quantity" },
            "docs": { "$push": {
                "_id": "$_id",
                "name": "$name",
                "quantity": "$quantity"
            }}
        }},
        { "$project": {
            "maxQuantity": 1,
            "docs": {
                "$setDifference": [
                   { "$map": {
                       "input": "$docs",
                       "as": "doc",
                       "in": {
                           "$cond": [ 
                               { "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
                               "$$doc",
                               false
                           ]
                       }
                   }},
                   [false]
                ]
            }
        }}
    ])
    

    したがって、すべてを配列に格納してから、各配列メンバーをテストして、その値が最大値として記録された値と一致するかどうかを確認し、一致しないものは破棄します。

    _idを保持します 配列ドキュメントの値は、それが「一意」であり、 $ setDifference 値を除外する場合。ただし、もちろん、「名前」が常に一意である場合は、必須ではありません。

    $map<から必要なフィールドを返すこともできます。 / code> 、しかし、たとえば、ドキュメント全体を返すだけです。

    これにはBSONサイズの制限である16MBを超えないという制限があるため、小さなデータサンプルでも問題ありませんが、(配列コンテンツを事前にフィルタリングできないため)潜在的に大きなリストを生成するものは、 「最大」値を見つけるための別のクエリと、一致するドキュメントをフェッチするための別のクエリ。



    1. C#.NetでMongoDBに保存されたJavascript関数を呼び出す

    2. RuntimeError:-ERR不明なコマンドがRubyでredisgemを実行しています

    3. SQLで日付から日、月、年を取得する方法

    4. Redisがシングルスレッドの場合、どうしてこんなに速くなるのでしょうか?