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

MongoDB:ドキュメント内のキーの数を数える方法は?

    集約フレームワークを介してMongoDB3.6以降を使用する場合は、かなり可能です。 $objectToArrayを使用してください。 ドキュメントを配列に変換するための集計パイプライン内の演算子。戻り配列には、元のドキュメントの各フィールド/値のペアの要素が含まれています。戻り配列の各要素は、2つのフィールドkを含むドキュメントです。 およびv

    ドキュメントをルート化するための参照は、 $$ROOTを介して可能になります。 集約パイプラインステージで現在処理されている最上位のドキュメントを参照するシステム変数。

    配列を取得したら、 $addFieldsの使用を活用できます。 カウントを保持するフィールドを作成するパイプラインステップと実際のカウントは、 $sizeを使用して導出されます オペレーター。

    これはすべて、次のように式をネストすることにより、単一のパイプラインで実行できます。

    db.collection.aggregate([
        { "$addFields": {
            "count": {
                "$size": { 
                    "$objectToArray": "$$ROOT"
                }
            }
        } }     
    ])
    

    出力例

    {
        "_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
        "a" : 1.0,
        "b" : 1.0,
        "c" : 2.0,
        "z" : 2.0,
        "count" : 5
    }
    

    _idを除外するには フィールドでは、 $filterを使用できます 演算子として:

    db.collection.aggregate([
        {
            "$addFields": {
                "count": {
                    "$size": { 
                        "$filter": {
                            "input": { "$objectToArray": "$$ROOT" },
                            "as": "el",
                            "cond": { "$ne": [ "$$el.k", "_id" ] }
                        }
                    }
                }
            }
        }     
    ])
    

    または、0zkr PMが提案するように、 $projectを追加するだけです。 最初のパイプラインステップ:

    db.collection.aggregate([
        { "$project": { "_id": 0 } },
        { "$addFields": {
            "count": {
                "$size": { 
                    "$objectToArray": "$$ROOT"
                }
            }
        } }     
    ])
    


    1. Cloudera Data Platformオペレーショナルデータベース(COD)入門

    2. HBaseとHive–より良い組み合わせ

    3. Dockerコンテナからホストmongodbに接続します

    4. Redisからのデータをマッピングする効率的な方法