Агрегационные вызовы, которые выполняются с использованием кода разбора облака, не дают требуемого результата.Я не уверен, что это проблема с синтаксисом, который мы используем, или есть какие-то пропущенные вещи, которые нам нужны для правильной работы вызовов агрегации конвейера.
Для требуемого вызова агрегации мы создаемТрубопровод, который использует пять разных этапов.На пяти этапах мы используем следующие четыре функции: 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. Никаких ошибок не возникает из-за синтаксиса, просто нет результатов.ограничения в вызовах агрегации разбора, которые могли бы объяснить причину сбоя вызова?