mongoosejs 如何 关联字段?

发布于 2022-09-13 01:09:17 字数 498 浏览 20 评论 0

RT,例如下面这种业务场景:

const docs = await SendMessage.aggregate([
    {
        $match: {
            channel_id: Types.ObjectId(id),
        }
    },
    {
        $project: {
            text: '$msg_content',
            createdAt: '$send_time',
            user: {
                _id: '$msg_from', // 某个userId
                name: null, // 如何根据userId在这里给它相关username
            },
        }
    },
    {
        $sort: {
            _id: -1,
        }
    },
])

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

方觉久 2022-09-20 01:09:17

我在用mongoose,后来发现aggregate下面$lookup这个方法可以解决问题!

const docs = await SendMessage.aggregate([
    {
        $match: {
            channel_id: Types.ObjectId(id),
        }
    },
    {
        $lookup: {
            from: 'users',
            localField: 'msg_from',
            foreignField: '_id',
            as: 'users',
        }
    },
    {
        $project: {
            text: '$msg_content',
            createdAt: '$send_time',
            user: {
                _id: '$msg_from',
                name: {
                    $arrayElemAt: ['$users.username', 0],
                },
                avatar: {
                    $let: {
                        vars: {
                            username: {
                                $arrayElemAt: ['$users.username', 0],
                            },
                        },
                        in: {
                            $concat: ['https://dummyimage.com/200x200/00E67D/000.jpg&text=', '$username'],
                        },
                    },
                },
            },
        }
    },
    {
        $sort: {
            _id: -1,
        }
    },
])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文