sql >> Database >  >> NoSQL >> MongoDB

Pymongo-aggregaat:filter op aantal velden (dynamisch)

Ja, u kunt nu een aggregatie-operator gebruiken $objectToArray (SERVER-23310 ) om sleutels in waarden om te zetten. Het moet in staat zijn om 'dynamisch' aantal velden te tellen. Deze operator combineren met $addFields kan best handig zijn.

Beide operators zijn beschikbaar in MongoDB v3.4.4+Uw bovenstaande documenten als voorbeeld gebruiken:

db.sports.aggregate([
          { $addFields : 
             { "numFields" : 
               { $size:
                 { $objectToArray:"$$ROOT"}
               }
             }
          }, 
          { $match: 
            { numFields: 
              {$gt:2}
            }
          }
])

De aggregatiepijplijn hierboven voegt eerst een veld toe met de naam numFields . De waarde zou de grootte van een array zijn. De array zou het aantal velden in het document bevatten. De tweede fase zou alleen filteren op 2 velden en meer (twee velden omdat er nog _id is veld plus name ).

In PyMongo , zou de bovenstaande aggregatiepijplijn er als volgt uitzien:

cursor = collection.aggregate([
                         {"$addFields":{"numFields":
                                         {"$size":{"$objectToArray":"$$ROOT"}}}}, 
                         {"$match":{"numFields":{"$gt":2}}}
         ])

Na het bovenstaande te hebben gezegd, zou ik, indien mogelijk voor uw gebruiksscenario, willen voorstellen om uw gegevensmodellen te heroverwegen voor een gemakkelijkere toegang. d.w.z. een nieuw veld toevoegen om het aantal sporten bij te houden wanneer een nieuwe sportpositie wordt ingevoegd/toegevoegd.




  1. Maak convertToCapped ongedaan naar een verzameling

  2. MongoDB Totale som van elke sleutel op een subdocument

  3. Mongodb - regex match van sleutels voor subdocumenten

  4. Maak MongoDB ObjectID van datum in het verleden met behulp van PHP-stuurprogramma