sql >> Database teknologi >  >> NoSQL >> MongoDB

Pymongo-aggregat:filtrer efter antal felter (dynamisk)

Ja, du kan nu bruge en aggregeringsoperator $objectToArray (SERVER-23310 ) for at omdanne nøgler til værdier. Det skal være i stand til at tælle 'dynamisk' antal felter. Ved at kombinere denne operator med $addFields kunne være ret nyttigt.

Begge operatører er tilgængelige i MongoDB v3.4.4+Ved brug af dine dokumenter ovenfor som eksempel:

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

Aggregeringspipelinen ovenfor tilføjer først et felt kaldet numFields . Værdien ville være størrelsen af ​​et array. Arrayet ville indeholde antallet af felter i dokumentet. Det andet trin ville kun filtrere for 2 felter og mere (to felter, fordi der stadig er _id felt plus name ).

I PyMongo , vil ovenstående aggregeringspipeline se ud som:

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

Når det er sagt ovenstående, vil jeg, hvis det er muligt for din brugssag, foreslå at genoverveje dine datamodeller for lettere adgang. dvs. Tilføj et nyt felt for at holde styr på antallet af sportsgrene, når en ny sportsposition indsættes/tilføjes.




  1. Mongodb - er pålidelighedsproblemer stadig betydelige?

  2. MongoDB bruger NOT og AND sammen

  3. mongodb opdaterer alle dokumenter med at øge værdien med 1

  4. EPEL MongoDB starter ikke på EC2 Amazon AMI