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



Mongodb How Count Number Keys Document



解決:

集約フレームワークを介して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 ']}}}}}}}}])

または0zkrPMによって提案されているように、単に追加します $ project 最初のパイプラインステップ:



db.collection.aggregate([{'$ project':{'_ id':0}}、{'$ addFields':{'count':{'$ size':{'$ objectToArray': '$$ ROOT' }}}}]) 

そのための組み込みコマンドはありません。このドキュメントを取得して、自分でキーを数えます。


Mongoでは(ほとんどのNoSQLソリューションと同様に)、後でクエリを実行する場合(たとえば、「異なるキーの数> 12」)、そのような値を事前に計算することをお勧めします。したがって、新しい値を追加することを検討する必要があります。新しいキーが追加されるたびにインクリメントするフィールド「keyCount」。