背景:
- 數(shù)據(jù)庫有一個
merchant
集合回官,集合中保存的是商戶信息查排,每個商戶一條記錄 - 每個商戶會有很多會員闹伪,會員記錄存儲在商戶記錄的
member
數(shù)組屬性中 - 每個會員會有很多消費記錄吁讨,消費記錄存儲在會員記錄的
consumption
數(shù)組字段中
merchant
集合中保存的數(shù)據(jù)如下面所示:
{...},
{...},
{
merchant_id: xxxxxx,
member: [
{...},
{..},
{
member_id: xxxxxx,
consumption: [
{...},
{...},
{
consumption_id: xxxxxx,
amount: xx,
timestamp: xx,
}
]
}
]
}
需求:
作為商戶疚顷,我需要通過一次查詢獲群狄住:分頁獲取我的會員記錄,包括會員的消費記錄腿堤。
該查詢包括兩次分頁查詢阀坏,例如:查詢出前20條會員記錄,每個會員包括前20條消費記錄笆檀。
遇到的問題:
查詢出前20條會員記錄容易忌堂,使用 $.slice()
即可,問題出在無法同時得到每個會員的前20條消費記錄误债。
整了許久也沒有搞定浸船。
變通的處理方法
分兩步走:
第一步:只分頁查詢出前20條會員記錄,不包含其下的消費記錄寝蹈。
第二步:當(dāng)用戶需要查看某個會員的消費記錄時李命,再分頁查詢出該會員的前20條消費記錄。
第二步中有個處理關(guān)鍵點:通過 $.arrayElemAt(['$member', 0])
將會員記錄從 member 數(shù)組中提取出來箫老。因為只查詢某一個會員的消費記錄封字,所以可以提取出這一個會員信息,將其從 list[0] 數(shù)組狀態(tài)變?yōu)?json 對象狀態(tài)耍鬓,這樣就可以接著通過 $.slice()
分頁取出該會員的前20條消費記錄阔籽。期間會多次用到 Aggregate.project()
核心代碼如下:
.project({
member0: $.arrayElemAt(['$member', 0]),
})
.project({
member0: {
consumption: $.slice(['$member0.consumption', 0, 20])
}
})