MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Wie zählt man die Anzahl der Schlüssel in einem Dokument?

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"
            }
        }
    } }     
])