sql >> Databáze >  >> NoSQL >> MongoDB

Agregát Pymongo:filtrování podle počtu polí (dynamické)

Ano, nyní můžete použít agregační operátor $objectToArray (SERVER-23310 ) pro přeměnu klíčů na hodnoty. Měl by být schopen spočítat „dynamický“ počet polí. Kombinace tohoto operátoru s $addFields může být docela užitečné.

Oba operátoři jsou k dispozici v MongoDB v3.4.4+. Jako příklad použijte vaše dokumenty výše:

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

Výše uvedený agregační kanál nejprve přidá pole s názvem numFields . Hodnota by byla velikost pole. Pole bude obsahovat počet polí v dokumentu. Druhá fáze by filtrovala pouze 2 pole a více (dvě pole, protože stále existuje _id pole plus name ).

V PyMongo , výše uvedený agregační kanál bude vypadat takto:

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

Po výše uvedeném, pokud je to možné pro váš případ použití, bych navrhl přehodnotit vaše datové modely pro snadnější přístup. tj. Přidejte nové pole pro sledování počtu sportů při vložení/přidání nové sportovní pozice.




  1. Jaké jsou všechny mongoose události a kde jsou zdokumentovány?

  2. Použití Async s MongoDb k vyplnění dokumentů sbírky v pořadí

  3. Jak používat MongoRegex (ovladač MongoDB C#)

  4. Najděte všechny duplicitní dokumenty v kolekci MongoDB podle klíčového pole