下面的代码(两行被注释掉)
myComments.aggregate(
{ $sort: { createdAt: -1 } },
{ $match: query },
{ $group: {
_id: {
activity: "$activity",
writer: "$writer"
},
summary: {
// $arrayToObject: {
$push: {
"k": "$userID",
"v": "$commentText",
}
// }
},
} },
{ $project: { _id: 0 } },
( err, data ) => {
console.log( JSON.stringify( data || [] ) );
}
)
按预期生成“摘要”数组:
[ {"summary":[ {"k":183044,"v":"adf"}, {"k":184817,"v":"be"}, {"k":187252,"v":"c"} ]},
{"summary":[ {"k":183044,"v":"146"}, {"k":184817,"v":"25"}, {"k":187252,"v":"3"} ]} ]
但是,当我删除注释并允许 $arrayToObject
对这些数组进行操作时,输出 data
未定义。
我是否错误地使用了其中一个或两个命令?这样嵌套它们是不正确的吗?
最佳答案
在$group
中,当每个文档被迭代时,相应的以下对象将被插入summary
字段,因此在小组阶段结束时summary
> 将是一个对象数组。
{
"k": "$userID",
"v": "$commentText"
}
此外,您无法将 $arrayToObject
应用于摘要,因为您的键(k)不是字符串。因此,如果 $userID 不是字符串,您需要在小组赛阶段将其转换为字符串。请尝试如下:
myComments.aggregate(
{ $sort: { createdAt: -1 } },
{ $match: query },
{
$group: {
_id: {
activity: "$activity",
writer: "$writer"
},
summary: {
$push: {
"k": { $toString: "$userID" },
"v": "$commentText",
}
},
}
},
{
$project: {
_id: 0,
summary: {
$arrayToObject: "$summary"
}
}
},
(err, data) => {
console.log(JSON.stringify(data || []));
}
)
关于mongodb - 如何将 $arrayToObject 应用于 mongodb 聚合中 $push 输出的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60322299/