Docela možné, pokud používáte MongoDB 3.6 a novější prostřednictvím agregačního rámce. Použijte $objectToArray
operátor v rámci agregačního kanálu pro převod dokumentu na pole. Návratové pole obsahuje prvek pro každý pár pole/hodnota v původním dokumentu. Každý prvek v poli návratu je dokument, který obsahuje dvě pole k
a v
.
Odkaz na kořen dokumentu je možný prostřednictvím $$ROOT
systémová proměnná, která odkazuje na dokument nejvyšší úrovně aktuálně zpracovávaný ve fázi agregačního kanálu.
Po získání pole pak můžete využít použití $addFields
krok kanálu k vytvoření pole, které obsahuje počty a skutečný počet je odvozen pomocí $size
operátor.
To vše lze provést v jediném kanálu vnořením výrazů následovně:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
Ukázkový výstup
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
Chcete-li vyloučit _id
můžete použít $filter
operátor jako:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
nebo jak navrhuje 0zkr PM, jednoduše přidejte $project
krok potrubí na začátku:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])