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