背景:
- 数据库有一个
merchant
集合,集合中保存的是商户信息,每个商户一条记录 - 每个商户会有很多会员,会员记录存储在商户记录的
member
数组属性中 - 每个会员会有很多消费记录,消费记录存储在会员记录的
consumption
数组字段中
merchant
集合中保存的数据如下面所示:
{...},
{...},
{
merchant_id: xxxxxx,
member: [
{...},
{..},
{
member_id: xxxxxx,
consumption: [
{...},
{...},
{
consumption_id: xxxxxx,
amount: xx,
timestamp: xx,
}
]
}
]
}
需求:
作为商户,我需要通过一次查询获取:分页获取我的会员记录,包括会员的消费记录。
该查询包括两次分页查询,例如:查询出前20条会员记录,每个会员包括前20条消费记录。
遇到的问题:
查询出前20条会员记录容易,使用 $.slice()
即可,问题出在无法同时得到每个会员的前20条消费记录。
整了许久也没有搞定。
变通的处理方法
分两步走:
第一步:只分页查询出前20条会员记录,不包含其下的消费记录。
第二步:当用户需要查看某个会员的消费记录时,再分页查询出该会员的前20条消费记录。
第二步中有个处理关键点:通过 $.arrayElemAt(['$member', 0])
将会员记录从 member 数组中提取出来。因为只查询某一个会员的消费记录,所以可以提取出这一个会员信息,将其从 list[0] 数组状态变为 json 对象状态,这样就可以接着通过 $.slice()
分页取出该会员的前20条消费记录。期间会多次用到 Aggregate.project()
核心代码如下:
.project({
member0: $.arrayElemAt(['$member', 0]),
})
.project({
member0: {
consumption: $.slice(['$member0.consumption', 0, 20])
}
})