收藏
回答

关联查询looup使用pipeline变得很慢

框架类型 问题类型 终端类型 AppID 环境ID 基础库版本
小程序 Bug 微信iOS客户端 wx83e281f186d567f9 alivestech-abcdefghijklmnopqrstuvwxyz 2.14.1
直接用localField和foreignField关联:
db.collection('AccountMember').aggregate()
	.match({account})
	.lookup({//关联出owner的User数据
		from: 'User',
		localField: 'owner', foreignField: '_id',
		as: 'ownerUsers',
	})
	.limit(100)
	.end()
执行成功,聚合输出 99 个记录,耗时 393ms

为了用project减少不必要的User字段,改用pipeline:
db.collection('AccountMember').aggregate()
	.match({account: '79550af260d580bd21d98f224427cb1d'})
	//关联出owner的User数据
	.lookup({
		from: 'User',
		// localField: 'owner', foreignField: '_id',
		let: {owner: '$owner'},
		pipeline: _.aggregate.pipeline()
		  .match(_.expr(_.aggregate.eq(['$_id', '$$owner'])))
		  .project({avatarUrl: 1, nickName: 1}).done(),
		as: 'ownerUsers',
	})
	// .sort({sn:1})
	.limit(100)
	.end()
执行成功,聚合输出 99 个记录,耗时 4554ms



最后一次编辑于  2022-02-17
回答关注问题邀请回答
收藏

1 个回答

  • 爱来时
    爱来时
    2022-02-17

    转贴一下官方答复:

    1、我们应该尽可能的避免使用子查询;

    2、如果是因为字段冗余导致您需要使用子查询,您可以关联查询(lookup)之后再用project过滤所需要的字段,而不是增加子查询使用。

    3、对于查询用到的所有条件,都应该尽可能建立组合索引,可以参考mongodb组合索引的设计规则设计(前缀匹配)。

    综上,请尽可能避免使用子查询,会成倍的消耗查询算力,拉低查询效率。

    2022-02-17
    有用 1
    回复
登录 后发表内容