MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Pymongo агрегат:филтриране по брой полета номер (динамично)

Да, вече можете да използвате оператор за агрегиране $objectToArray (SERVER-23310 ), за да превърне ключовете в стойности. Трябва да може да брои „динамичен“ брой полета. Комбиниране на този оператор с $addFields може да бъде доста полезно.

И двата оператора са налични в MongoDB v3.4.4+Като използвате вашите документи по-горе като пример:

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

Конвейерът за агрегиране по-горе първо ще добави поле, наречено numFields . Стойността ще бъде размерът на масив. Масивът ще съдържа броя на полетата в документа. Вторият етап ще филтрира само за 2 полета и повече (две полета, защото все още има _id поле плюс name ).

В PyMongo , горният тръбопровод за агрегиране ще изглежда така:

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

Като казах горното, ако е възможно за вашия случай на употреба, бих предложил да преразгледате вашите модели на данни за по-лесен достъп. т.е. добавете ново поле, за да следите броя на спортовете, когато се вмъкне/добави нова спортна позиция.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Защо MongoDB вече не позволява използването на $set и $unset с празен документ?

  2. Meteor:Уникален MongoDB URL за различни потребители

  3. Grails - Свързване към база данни MongoDB чрез удостоверяване

  4. MongoDB и Mongoose:Вложен масив от референтни идентификатори на документи

  5. Mongoose не записва данни