有这样一张表结构,如下:
export interface IRecordRaw1 {
_id:string
/**
* 名称
*/
name: string,
/**
* 图片列表
*/
imgItems:
{
/**
* 缩略图
*/
fuzzyImg: string,
/**
* 名称
*/
name: string,
/**
* 唯一标识
*/
_id?: string,
/**
* 是否锁定
*/
isLock: boolean
}[]
}
另外有一张表,如下
export interface IRecordRaw2{
/**
* 表一中的ID
*/
gameID: string,
/**
* 表一中,imgItems中的ID
*/
imgID: string
}
查询表2记录,然后要关联显示出表1的name,以及表1中imgItems中的name属性,可以通过聚合函数aggregate()、lookup()、project()、来实现,具体如下:
return await this.Model.aggregate<IGameFindDayBookView>().match(filter)
.lookup({ from: '表1', localField: 'gameID', foreignField: '_id', as: 'game' })
.project({
img:
{
$min:
{
$filter:
{
input: { $min: '$game.imgItems' }, as: 'imgs', cond: {
$eq: ['$$imgs._id', '$imgID']
}
}
}
},
name:1,
gameName: { $min: '$game.name' }
}) // 通过lookup返回的$game.name字段是一个数组,所以必须用$min修饰符
.project({ img: { fuzzyImg: '$img.fuzzyImg', name: '$img.name' }, name:1, gameName: 1 })
.sort(orderBy ?? '-createDatetime')
.skip((currentPage - 1) * pageSize)
.limit(pageSize)
}
这里注意,使用两次project过滤显示的字段,由于第一次会返回imgItems中的所有属性,但是实际我们只需要fuzzImg和name属性,所以需要二次过滤。