在解析云代码上进行的聚合调用未提供所需的结果。我不确定这是否是我们使用的语法问题,还是我们需要一些丢失的东西才能使管道聚合调用正常工作。
对于所需的聚集调用,我们正在构建一个使用五个不同阶段的管道。在这五个阶段中,我们使用以下四个功能:addFields
,lookup
,unwind
和group
。已经在MongoDB罗盘应用程序上对此进行了测试,并且结果正确显示。导出聚合并将其转换为我们认为正确的语法后,该查询将不返回任何结果。
仅使用一个阶段的简单聚合管道可以正常工作。已针对group by和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中找到的所需结果。不会因语法而引发任何错误,只是没有结果。解析聚合调用中是否有任何限制可以解释调用失败的原因?
答案 0 :(得分:0)
问题似乎出在子字符串调用上。
在MongoDB指南针中,为pUser
字段分配了一个值,该值需要修整才能访问objectId
。
当尝试从解析云代码聚合中执行相同操作时,由于pUser
包含objectId
作为子元素,因此不需要进行修剪。
要访问我正在使用的objectId
:
user : '$pUser.objectId'
代替
user : { $substr : ['pUser', 6, -1]}