Durchaus möglich, wenn MongoDB 3.6 und höher über das Aggregationsframework verwendet wird. Verwenden Sie $objectToArray
-Operator innerhalb einer Aggregationspipeline, um das Dokument in ein Array zu konvertieren. Das Rückgabearray enthält ein Element für jedes Feld/Wert-Paar im Originaldokument. Jedes Element im Rückgabearray ist ein Dokument, das zwei Felder k
enthält und v
.
Der Verweis auf das Root des Dokuments wird durch den $$ROOT
ermöglicht Systemvariable, die auf das Dokument der obersten Ebene verweist, das derzeit in der Phase der Aggregationspipeline verarbeitet wird.
Beim Abrufen des Arrays können Sie dann die Verwendung von $addFields
nutzen Pipeline-Schritt zum Erstellen eines Felds, das die Anzahl enthält, und die tatsächliche Anzahl wird mithilfe von $size
abgeleitet Betreiber.
All dies kann in einer einzigen Pipeline durchgeführt werden, indem die Ausdrücke wie folgt verschachtelt werden:
db.collection.aggregate([
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])
Beispielausgabe
{
"_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
"a" : 1.0,
"b" : 1.0,
"c" : 2.0,
"z" : 2.0,
"count" : 5
}
Um die _id
auszuschließen Feld können Sie den $filter
verwenden Operator als:
db.collection.aggregate([
{
"$addFields": {
"count": {
"$size": {
"$filter": {
"input": { "$objectToArray": "$$ROOT" },
"as": "el",
"cond": { "$ne": [ "$$el.k", "_id" ] }
}
}
}
}
}
])
oder wie von 0zkr PM vorgeschlagen, fügen Sie einfach ein $project
hinzu Pipeline-Schritt am Anfang:
db.collection.aggregate([
{ "$project": { "_id": 0 } },
{ "$addFields": {
"count": {
"$size": {
"$objectToArray": "$$ROOT"
}
}
} }
])