MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Agregat Pymongo:filtruj według liczby pól (dynamiczny)

Tak, możesz teraz użyć operatora agregacji $objectToArray (SERVER-23310 ), aby zamienić klucze w wartości. Powinien być w stanie policzyć „dynamiczną” liczbę pól. Łącząc ten operator z $addFields może być bardzo przydatne.

Oba operatory są dostępne w MongoDB v3.4.4+. Na przykładzie powyższych dokumentów:

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

Powyższy potok agregacji najpierw doda pole o nazwie numFields . Wartość byłaby rozmiarem tablicy. Tablica zawierałaby liczbę pól w dokumencie. Drugi etap filtrowałby tylko 2 pola i więcej (dwa pola, ponieważ nadal istnieje _id pole plus name ).

W PyMongo , powyższy potok agregacji będzie wyglądał następująco:

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

Powiedziawszy powyższe, jeśli to możliwe dla twojego przypadku użycia, sugerowałbym ponowne rozważenie modeli danych dla łatwiejszego dostępu. tj. Dodaj nowe pole, aby śledzić liczbę dyscyplin sportowych po wstawieniu/dodaniu nowej pozycji sportowej.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Uzyskaj przefiltrowaną liczbę elementów w tablicy z $lookup wraz z całym dokumentem

  2. aktualizacja mongo db zmieniająca kolejność pól obiektów

  3. MongoDB Java:Znajdowanie obiektów w Mongo za pomocą operatora QueryBuilder $in nic nie zwraca

  4. Używanie aplikacji Meteor na iPadzie, która została wdrożona na zdalnym serwerze z Meteor-up (problem z połączeniem z mongodb)

  5. Dlaczego nie zaleca się używania funkcji przechowywanych po stronie serwera w MongoDB?