mongodb管理子集数组id查询

 0 0条评论

有这样一张表结构,如下:

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属性,所以需要二次过滤。

本文作者:双黑

版权声明:本站文章欢迎链接分享,禁止全文转载!

游客