Совокупный конвейер из облачного кода ничего не возвращает - PullRequest
0 голосов
/ 28 января 2019

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

Для требуемого вызова агрегации мы создаемТрубопровод, который использует пять разных этапов.На пяти этапах мы используем следующие четыре функции: addFields, lookup, unwind и group.Это было проверено в приложении компаса MongoDB, и результат отображается правильно.Когда агрегаты экспортируются и преобразуются в то, что мы считаем правильным синтаксисом, запрос не возвращает результатов.

Простые конвейеры агрегации, которые используют только один этап, работают нормально.Это было проверено как для групповых вызовов, так и для вызовов addField.Похоже, что как только несколько этапов добавляются в конвейер, возникает сбой.

Вызов агрегации, который создается непосредственно из экспорта MongoDB Compass в Node, выглядит следующим образом:

[
  {
    '$addFields': {
      'user': {
        '$substr': [
          '$_p_pUser', 6, -1
        ]
      }
    }
  }, {
    '$lookup': {
      'from': '_User', 
      'localField': 'user', 
      'foreignField': '_id', 
      'as': 'userobject'
    }
  }, {
    '$addFields': {
      'username': '$userobject.username'
    }
  }, {
    '$unwind': {
      'path': '$username'
    }
  }, {
    '$group': {
      '_id': '$username', 
      'total': {
        '$sum': '$score'
      }
    }
  }
]

Вышеуказанный вызов при преобразовании в приведенный здесь синтаксис (https://docs.parseplatform.org/js/guide/#aggregate), выглядит следующим образом:

var pipeline = {
        addFields : { user: { $substr : ['$_p_pUser', 6, -1]} },
        lookup : {
            from: '_User',
            localField: 'user',
            foreignField: 'objectId',
            as: 'userobject'
        },
        addFields : { username: '$userobject.username' },
        unwind : { path: '$username' },
        group : {
            objectId: '$username',
            total : {
              $sum : '$score'
            }
        }
    };
var pipelineResults = await gameTableQuery.aggregate(pipeline);

Это не дало никаких результатов. Он также был проверен с использованием определенного имени поля (pUser)вместо _p_pUser (требуется, чтобы запрос работал в MongoDB Compass).

var pipeline = {
        addFields : { user: { $substr : ['$pUser', 6, -1]} },
        lookup : {
            from: '_User',
            localField: 'user',
            foreignField: 'objectId',
            as: 'userobject'
        },
        addFields : { username: '$userobject.username' },
        unwind : { path: '$username' },
        group : {
            objectId: '$username',
            total : {
              $sum : '$score'
            }
        }
    };

Возможной проблемой может быть дублирование функций addFields. Я также пытался выполнить тот же вызов, используя один вызов addFieldsвместо этого.

var pipeline = {
        addFields : 
        { 
            user: { $substr : ['pUser', 6, -1]},
            username: '$userobject.username'
        },
        lookup : {
            from: '_User',
            localField: 'user',
            foreignField: 'objectId',
            as: 'userobject'
        },
        unwind : { path: '$username' },
        group : {
            objectId: '$username',
            total : {
              $sum : '$score'
            }
        }
    };

Эти вызовы были сделаны с помощью облачного кода, и они не возвращают требуемые результаты, которые были найдены в MongoDB Compass. Никаких ошибок не возникает из-за синтаксиса, просто нет результатов.ограничения в вызовах агрегации разбора, которые могли бы объяснить причину сбоя вызова?

1 Ответ

0 голосов
/ 29 января 2019

Кажется, проблема была в вызове подстроки.

В компасе MongoDB поле pUser было присвоено значение, которое требовало обрезки для доступа к objectId.При попытке сделать то же самое с помощью агрегатного кода облачного анализа обрезка не была необходима, поскольку pUser содержит objectId в качестве дочернего элемента.

Для доступа к objectId я сейчас использую:

user : '$pUser.objectId'

вместо

user : { $substr : ['pUser', 6, -1]}

...