直接用localField和foreignField关联:
db.collection('AccountMember').aggregate()
.match({account})
.lookup({
from: 'User',
localField: 'owner', foreignField: '_id',
as: 'ownerUsers',
})
.limit(100)
.end()
执行成功,聚合输出 99 个记录,耗时 393ms
为了用project减少不必要的User字段,改用pipeline:
db.collection('AccountMember').aggregate()
.match({account: '79550af260d580bd21d98f224427cb1d'})
.lookup({
from: 'User',
let: {owner: '$owner'},
pipeline: _.aggregate.pipeline()
.match(_.expr(_.aggregate.eq(['$_id', '$$owner'])))
.project({avatarUrl: 1, nickName: 1}).done(),
as: 'ownerUsers',
})
.limit(100)
.end()
执行成功,聚合输出 99 个记录,耗时 4554ms
转贴一下官方答复:
1、我们应该尽可能的避免使用子查询;
2、如果是因为字段冗余导致您需要使用子查询,您可以关联查询(lookup)之后再用project过滤所需要的字段,而不是增加子查询使用。
3、对于查询用到的所有条件,都应该尽可能建立组合索引,可以参考mongodb组合索引的设计规则设计(前缀匹配)。
综上,请尽可能避免使用子查询,会成倍的消耗查询算力,拉低查询效率。