Helt muligt, hvis du bruger MongoDB 3.6 og nyere gennem aggregeringsrammen. Brug $objectToArray
operatør inden for en aggregeringspipeline for at konvertere dokumentet til et array. Returarrayet indeholder et element for hvert felt/værdipar i det originale dokument. Hvert element i returarrayet er et dokument, der indeholder to felter k
og v
.
Referencen til at roote dokumentet er muliggjort gennem $$ROOT
systemvariabel, der refererer til dokumentet på øverste niveau, der i øjeblikket behandles i aggregeringspipelinestadiet.
Når du får arrayet, kan du så udnytte brugen af $addFields
pipeline-trin for at oprette et felt, der indeholder tællingerne, og det faktiske tæller udledes ved brug af $size
operatør.
Alt dette kan gøres i en enkelt pipeline ved at indlejre udtrykkene som følger:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
Eksempel på output
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
For at ekskludere _id
feltet, kan du bruge $filter
operatør som:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
eller som foreslået af 0zkr PM skal du blot tilføje et $project
pipeline trin i begyndelsen:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])