Mycket möjligt om du använder MongoDB 3.6 och senare genom aggregeringsramverket. Använd $objectToArray
operatör inom en aggregeringspipeline för att konvertera dokumentet till en array. Returmatrisen innehåller ett element för varje fält/värdepar i originaldokumentet. Varje element i returmatrisen är ett dokument som innehåller två fält k
och v
.
Referensen till rotdokumentet är möjlig genom $$ROOT
systemvariabel som refererar till dokumentet på toppnivå som för närvarande bearbetas i aggregeringspipelinesteget.
När du skaffar arrayen kan du sedan utnyttja $addFields
pipeline steg för att skapa ett fält som innehåller räkningarna och det faktiska antalet härleds med hjälp av $size
operatör.
Allt detta kan göras i en enda pipeline genom att kapsla uttrycken enligt följande:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
Exempel på utdata
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
För att utesluta _id
kan du använda $filter
operatör som:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
eller som föreslagits av 0zkr PM helt enkelt lägg till ett $project
pipeline steg i början:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])