Гистограмма в mongodb

#python #mongodb #mongodb-query #pymongo

#python #mongodb #mongodb-запрос #pymongo

Вопрос:

Что не так с этим кодом?

 File "<ipython-input-17-728073f2f109>", line 17
    {"$toInt" : 'page_start'}]}}},
                                 ^
SyntaxError: invalid syntax
 

Есть идеи, что это значит?

 import pandas as pd

def length_vs_references(articles):

    res = {"1-5" : 0, "6-10" : 0, "11-15" : 0, "16-20" : 0, "21-25" : 0, "25-30" : 0, ">30" :0}
    n = {"1-5" : 0, "6-10" : 0, "11-15" : 0, "16-20" : 0, "21-25" : 0, "25-30" : 0, ">30" :0}
    
    cursor = articles.aggregate([
        {'$match': {'$and' : [{'references': {'$exists': False}
        }, {'$ne':['$page_end', '']}, {'$ne':['$page_start', '']} ]}},
        {'$project': {'len_refernces': {"$size": '$references'},
                                                'pages': {'$subtract': [{"$toInt": 'page_end'},
                                                                        {"$toInt" : 'page_start'}]}}},
        
            {'$bucket' :{
            '$groupBy': '$pages',
            'boundaries': [ 0, 6, 11, 16, 21, 26, 31, 1000000],
                'default': 'Other',
             'key': {
                 'output': {"average": {"$avg" : '$len_references'}},
            }
                }
            }       
    ])
    return cursor
 

print(length_vs_references(articles))
 

Комментарии:

1. Я не собираюсь пытаться считать, но, скорее всего, вам не хватает скобки или их слишком много. Убедитесь, что все они совпадают

Ответ №1:

Вы пропустили и добавили некоторые $ . Логические значения true/false .

Должно быть это:

 articles.aggregate([
   {
      '$match': {
         'references': { '$exists': false },
         'page_end': { '$ne': '' },
         'page_start': { '$ne': '' }
      }
   },

   {
      '$project': {
         'len_refernces': { "$size": '$references' },
         'pages': {
            '$subtract': [
               { "$toInt": '$page_end' },
               { "$toInt": '$page_start' }
            ]
         }
      }
   },

   {
      '$bucket': {
         'groupBy': '$pages',
         'boundaries': [0, 6, 11, 16, 21, 26, 31, 1000000],
         'default': 'Other',
         'output': {
            "average": { "$avg": '$len_references' }
         },
      }
   }
])
 

Комментарии:

1. Привет, спасибо. Я внес изменения в свой код в соответствии с приведенным выше и теперь получаю OperationFailure: аргумент для $size должен быть массивом, но имел тип: отсутствует, полная ошибка: {‘ok’: 0.0, ‘errmsg’: ‘Аргумент для $size должен быть массивом, но имел тип: отсутствует’, ‘код’: 17124, ‘Кодовое имя’: ‘Location17124’}. Есть идеи?

2. Ошибка совершенно очевидна, поле references должно быть массивом. Вы не показываете никаких исходных данных, поэтому мы не можем помочь.

3. На самом деле конвейер агрегации бесполезен. Вы сопоставляете дальше references: { '$exists': false } , то есть выбираете только документы, которых references не существует, но позже пытаетесь получить длину этого поля.