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

Aggregato Pymongo:filtra per numero di campi (dinamico)

Sì, ora puoi utilizzare un operatore di aggregazione $objectToArray (SERVER-23310 ) per trasformare le chiavi in ​​valori. Dovrebbe essere in grado di contare il numero "dinamico" di campi. Combinando questo operatore con $addFields potrebbe essere abbastanza utile.

Entrambi gli operatori sono disponibili in MongoDB v3.4.4+Utilizzando i documenti sopra come esempio:

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

La pipeline di aggregazione sopra, prima aggiungerà un campo chiamato numFields . Il valore sarebbe la dimensione di un array. L'array conterrà il numero di campi nel documento. La seconda fase filtrerebbe solo per 2 campi e più (due campi perché c'è ancora _id campo più name ).

In PyMongo , la pipeline di aggregazione sopra sarebbe simile a:

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

Detto quanto sopra, se possibile per il tuo caso d'uso, suggerirei di riconsiderare i tuoi modelli di dati per un accesso più facile. ovvero aggiungere un nuovo campo per tenere traccia del numero di sport quando viene inserita/aggiunta una nuova posizione sportiva.