MongoDB聚合管道计算can_edit时判断内嵌数组成员返回false如何解决
解决方案
错误原因
$lookup操作的as返回值固定为数组类型:你的用户关联、文章分组关联都是一对一关系,返回数组内只会有1个元素,但直接使用$author._id会得到[作者ID]格式的数组,$group同理是数组包裹的分组对象,直接参与匹配必然返回false。- 未展平数组时,
$group.members.user会变成二维数组,无法和单个作者ID正常匹配。
正确聚合代码
Article.aggregate([ { $lookup: { from: "users", localField: "author", foreignField: "_id", as: "author", }, }, { $lookup: { from: "articlegroups", localField: "group", foreignField: "_id", as: "group" } }, // 展平lookup返回的数组为单个对象 { $set: { author: { $first: "$author" }, group: { $first: "$group" } } }, { $addFields: { can_edit: { $in: [ "$author._id", // 处理文章无分组的边界情况,避免报错 { $ifNull: ["$group.members.user", []] } ] } } } ])
低版本MongoDB兼容方案
如果你使用的MongoDB版本低于4.4,不支持$first操作符,可以将展平数组的步骤替换为:
{ $set: { author: { $arrayElemAt: ["$author", 0] }, group: { $arrayElemAt: ["$group", 0] } } }
内容的提问来源于stack exchange,提问作者chao
相关产品推荐
相关产品推荐

