sql >> Database >  >> NoSQL >> MongoDB

MongoDB:hoe het aantal sleutels in een document te tellen?

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


  1. MongoDB-replicasets met arbiters

  2. Meerdere Redis-instanties

  3. Rescue:Verbinding geweigerd - Kan geen verbinding maken met Redis op localhost:6379

  4. MongoDB versus MySQL