Heel goed mogelijk als u MongoDB 3.6 en nieuwer gebruikt via het aggregatieraamwerk. Gebruik de $objectToArray
operator binnen een aggregatiepijplijn om het document naar een array te converteren. De return-array bevat een element voor elk veld/waarde-paar in het originele document. Elk element in de return-array is een document dat twee velden bevat k
en v
.
De verwijzing naar het rooten van het document wordt mogelijk gemaakt door de $$ROOT
systeemvariabele die verwijst naar het document op het hoogste niveau dat momenteel wordt verwerkt in de aggregatiepijplijnfase.
Bij het verkrijgen van de array kunt u vervolgens gebruikmaken van $addFields
pijplijnstap om een veld te maken dat de tellingen bevat en de werkelijke telling wordt afgeleid met behulp van de $size
telefoniste.
Dit alles kan in een enkele pijplijn worden gedaan door de uitdrukkingen als volgt te nesten:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
Voorbeelduitvoer
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
De _id
uitsluiten veld, kunt u het $filter
. gebruiken operator als:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
of zoals voorgesteld door 0zkr PM voeg gewoon een $project
toe pijplijnstap aan het begin:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])