MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Pymongo-Aggregat:Filtern nach Anzahl der Felder (dynamisch)

Ja, Sie können jetzt einen Aggregationsoperator $objectToArray verwenden (SERVER-23310 ), um Schlüssel in Werte umzuwandeln. Es sollte in der Lage sein, eine „dynamische“ Anzahl von Feldern zu zählen. Kombinieren Sie diesen Operator mit $addFields könnte ganz nützlich sein.

Beide Operatoren sind in MongoDB v3.4.4 + verfügbar. Verwenden Sie Ihre obigen Dokumente als Beispiel:

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

Die obige Aggregationspipeline fügt zuerst ein Feld namens numFields hinzu . Der Wert wäre die Größe eines Arrays. Das Array würde die Anzahl der Felder im Dokument enthalten. Die zweite Stufe würde nur nach 2 Feldern und mehr filtern (zwei Felder, weil es immer noch _id gibt Feld plus name ).

In PyMongo , würde die obige Aggregationspipeline wie folgt aussehen:

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

Abgesehen davon würde ich vorschlagen, wenn es für Ihren Anwendungsfall möglich ist, Ihre Datenmodelle zu überdenken für leichteren Zugang. d.h. fügen Sie ein neues Feld hinzu, um die Anzahl der Sportarten zu verfolgen, wenn eine neue Sportposition eingefügt/hinzugefügt wird.