sql >> Databasteknik >  >> NoSQL >> MongoDB

Pymongo-aggregat:filtrera efter antal fältnummer (dynamiskt)

Ja, du kan nu använda en aggregeringsoperator $objectToArray (SERVER-23310 ) för att omvandla nycklar till värden. Den ska kunna räkna "dynamiskt" antal fält. Kombinera denna operator med $addFields kan vara ganska användbart.

Båda operatörerna är tillgängliga i MongoDB v3.4.4+Med dina dokument ovan som exempel:

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

Aggregeringspipelinen ovan kommer först att lägga till ett fält som heter numFields . Värdet skulle vara storleken på en array. Arrayen skulle innehålla antalet fält i dokumentet. Det andra steget skulle filtrera endast för 2 fält och fler (två fält eftersom det fortfarande finns _id fält plus name ).

I PyMongo , skulle ovanstående aggregeringspipeline se ut så här:

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

Efter att ha sagt ovanstående, om möjligt för ditt användningsfall, skulle jag föreslå att du omprövar dina datamodeller för enklare åtkomst. d.v.s. Lägg till ett nytt fält för att hålla reda på antalet sporter när en ny sportposition infogas/läggs till.




  1. Hur får man Redis att välja LRU vräkningspolicy för endast några av nycklarna?

  2. Hur man får det senaste meddelandet från chattkonversation i mongodb

  3. Hur frågar man efter datumintervall på MongoDB-samlingen där ISO-datumet lagras i strängfältet?

  4. MongoDB $toDate