Почему я получаю недопустимую ошибку в моем PyMongo Query - PullRequest
0 голосов
/ 04 декабря 2018

Я пишу запрос Pymongo, и он работает, когда я пишу его в моем MongoDB GUI, но продолжаю получать ошибку SyntaxError: invalid syntax.

Что я делаю не так?

def get_codes(request):
   get_code = newsCode.aggregate([{
    '$match': {
        'site': { 
            '$exists': true 
        },
        'segment': {
            '$exists': true
        }
   }, {
    '$group': {
        '_id': {
            'site': "$site",
            'seg_code': {
                '$substr': ["$segment", 0, 4]
            },
            'segment': "$segment"
        }
    }
   }, {
    '$project': {
        'site': "$_id.site",
        'seg_code': "$_id.seg_code",
        'segment': "$_id.segment"
    }
   }, {
    '$sort': {
        '_id': 1
    }
   }
  }])

Моя ошибка отображается на , около

 }, {
  '$project

Traceback:

Traceback (most recent call last):
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/utils/autoreload.py", line 225, in wrapper
fn(*args, **kwargs)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
self.check(display_num_errors=True)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/core/management/base.py", line 364, in check
include_deployment_checks=include_deployment_checks,
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/core/management/base.py", line 351, in _run_checks
return checks.run_checks(**kwargs)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/core/checks/registry.py", line 73, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/core/checks/urls.py", line 40, in check_url_namespaces_unique
all_namespaces = _load_all_namespaces(resolver)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/core/checks/urls.py", line 57, in _load_all_namespaces
url_patterns = getattr(resolver, 'url_patterns', [])
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/utils/functional.py", line 36, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/urls/resolvers.py", line 540, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/utils/functional.py", line 36, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/site-packages/django/urls/resolvers.py", line 533, in urlconf_module
return import_module(self.urlconf_name)
File "/Users/userName/anaconda3/envs/env_dp_36/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 978, in _gcd_import
File "<frozen importlib._bootstrap>", line 961, in _find_and_load
File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
File "/Users/userName/Desktop/Dash/dash/dash/urls.py", line 3, in <module>
from . import views
File "/Users/userName/Desktop/Dash/dash/dash/views.py", line 5, in <module>
from .datamanager import *
File "/Users/userName/Desktop/Dash/dash/dash/datamanager.py", line 471
}, {
 ^
SyntaxError: invalid syntax

Почему я получаю эту ошибку?Как я уже сказал, это работает, когда я делаю это в моем графическом интерфейсе.Что-то не так с моим синтаксисом?Код PyMongo должен отличаться от кода MongoDB?

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 05 декабря 2018

Добро пожаловать в StackOverflow!

Здесь происходит несколько вещей:

1) При использовании pymongo вы пишете на python, поэтому true необходимо изменить наTrue

2) Когда вы пытаетесь объединить эти запросы вместе, функция агрегации принимает список словарей, представляющих часть запроса.Размещенный вами фрагмент передает список в функцию, где первая запись - это часть, содержащая ваши клавиши $match и $group, но клавиша $project появляется после того, как этот словарь был закрыт фигурными скобками на строке.выше.Я не уверен, почему это не приводит к ошибке в оболочке pymongo, потому что есть определенное несоответствие скобок, которым Монго тоже не был бы доволен.

Я убрал выравнивание скобок вследующий фрагмент, хотя я не уверен, что могут быть другие проблемы с запросом, когда он выполняется в контексте приложения.

def get_codes(request):
    get_code = newsCode.aggregate([
        {'$match': {'site': {'$exists': true}, 'segment': {'$exists': true}}},
        {'$group': {
            '_id': {
                'site': "$site",
                'seg_code': {'$substr': ["$segment", 0, 4]},
                'segment': "$segment"
            },
        }},
        {'$project': {
            'site': "$_id.site",
            'seg_code': "$_id.seg_code",
            'segment': "$_id.segment"
        }},
        {'$sort': {'_id': 1}},
    ])

Последнее замечание: сортировка происходит в pymongo иначе, чемделает при написании необработанного запроса монго.Ссылка: Как сортировать Mongodb с пимонго

...