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

mongodbにk-vペアの配列として格納されているプロパティ内の特定のキーの「値」で並べ替える方法

    配列内の「キー」として「ポイント」値を持つすべてのドキュメントが必要であると想定し、その「キー」の「値」で並べ替えると、これは少し範囲外になります。 .find() メソッド。

    このようなことをした場合の理由

    db.collection.find({
        "setid": 154421, "data.k": "point" }
    ).sort({ "data.v" : -1 })
    

    問題は、 一致した要素は実行 「ポイント」の一致するキーがある場合、どちらかを判断する方法はありません data.v あなたはソートのために参照しています。また、sort .find()内 結果は次のようなことはしません:

    db.collection.find({
        "setid": 154421, "data.k": "point" }
    ).sort({ "data.$.v" : -1 })
    

    試してみる ソート内で位置演算子を使用し、基本的にvの値を使用する要素を指示します の上。ただし、これはサポートされておらず、サポートされていない可能性があります。最も可能性の高い説明として、その「インデックス」値はドキュメントごとに異なる可能性があります。

    しかし、この種の選択的 並べ替えは、.aggregate()

    db.collection.aggregate([
    
        // Actually shouldn't need the setid
        { "$match": { "data": {"$elemMatch": { "k": "points" } } } },
    
        // Saving the original document before you filter
        { "$project": {
            "doc": {
               "_id": "$_id",
               "setid": "$setid",
               "date": "$date",
               "version": "$version",
               "data": "$data"
            },
            "data": "$data"
        }}
    
        // Unwind the array
        { "$unwind": "$data" },
    
        // Match the "points" entries, so filtering to only these
        { "$match": { "data.k": "points" } },
    
        // Sort on the value, presuming you want the highest
        { "$sort": { "data.v": -1 } },
    
        // Restore the document
        { "$project": {
            "setid": "$doc.setid",
            "date": "$doc.date",
            "version": "$doc.version",
            "data": "$doc.data"
        }} 
    
    ])
    

    もちろん、それはdataを前提としています アレイには1つしかありません キーポイントを持つ要素。複数ある場合は、$groupする必要があります このような並べ替えの前に:

        // Group to remove the duplicates and get highest
        { "$group": { 
            "_id": "$doc",
            "value": { "$max": "$data.v" }
        }},
    
        // Sort on the value
        { "$sort": { "value": -1 } },
    
        // Restore the document
        { "$project": { 
            "_id": "$_id._id",
            "setid": "$_id.setid",
            "date": "$_id.date",
            "version": "$_id.version",
            "data": "$_id.data"
        }}
    

    したがって、 .aggregate() 複雑なを行うために ドキュメントを並べ替えても、元のドキュメントの結果を完全に返します。

    集計演算子 についてもう少し読んでください。 そして一般的なフレームワーク。これは、.find()を超えて学習するための便利なツールです。 。




    1. すべてのネームサーバーがUDPポート53に応答できませんでしたGoogleクラウド関数python3.7atlas mongodb

    2. 数値タイプフィールドのマングースfind()正規表現

    3. ドキュメントの外部に含まれる属性に基づくMapReduce集計

    4. MongoDB-配列内のドキュメントを更新します