如何使用Express从MongoDB聚合两个集合?

pdkcd3nj  于 2022-11-03  发布在  Go
关注(0)|答案(2)|浏览(176)

所以我现在有两个集合。一个是“posts”,另一个是“users”
这是帖子:

  • 识别码(_I)
  • 职称
  • 正文
  • 使用者
  • 日期

这是用户:

  • 识别码(_I)
  • 使用者名称
  • 电子邮件
  • 口令

我尝试以如下方式使用聚合:

router.get('/:user_id', async (req, res) => {
  try {
    // const profile = await User.findById(req.params.user_id);
    const profile = await User.agregate([
      {
        '$lookup': {
          'from': 'posts',
          'localField': '_id',
          'foreignField': 'user',
          'as': 'posts'
        }
      }
    ]);

    // Verify profile exists
    if (!profile) return res.status(400).json({ msg: 'Profile not found' });

    res.json(profile);
  } catch (err) {
    console.error(err.message);
    if (err.kind == 'ObjectId') {
      return res.status(400).json({ msg: 'Profile not found' });
    }
    res.status(500).send('Server error');
  }
});

请注意,第一个profile常量是注解的,但它是我用来根据X用户的_id(req.params.user_id)获取用户数据的常量。
现在我想创建的是通过访问X用户的配置文件来显示X用户创建的所有帖子,所以我需要匹配相应的用户,我需要传递req.params.user_id
这是我的新代码,它是不工作:

router.get('/:user_id', async (req, res) => {
  try {
    // const profile = await User.findById(req.params.user_id);
    const profile = await User.agregate([
      {
        '$lookup': {
          'from': 'posts',
          'localField': '_id',
          'foreignField': 'user',
          'as': 'posts'
        }
      }, {
        $unwind: "$posts"
      }, {
        $match: {
          "posts.user": req.params.user_id
        }
      }
    ]);

    // Verify profile exists
    if (!profile) return res.status(400).json({ msg: 'Profile not found' });

    res.json(profile);
  } catch (err) {
    console.error(err.message);
    if (err.kind == 'ObjectId') {
      return res.status(400).json({ msg: 'Profile not found' });
    }
    res.status(500).send('Server error');
  }
});

在我的console.log中显示的错误是“user.aggregate不是函数”。希望我能解释一下,谢谢!
我只想在users集合中添加一个新字段(posts数组)。

niknxzdl

niknxzdl1#

如果有人已经来了同样的要求,就像我一样,这里是解决方案后,两天的研究和询问LOL。

router.get('/:user_id', async (req, res) => {
  try {
    const userId = req.params.user_id;
    const [profile, postsByUser] = await Promise.all([User.findById(userId, '-password'), Post.find({ user: userId }).populate('user', ['_id', 'username', 'avatar']).sort({ date: -1 })]);

    // Verify profile exists
    if (!profile) return res.status(400).json({ msg: 'Profile not found' });

    // res.json(profile);
    res.json({ ...profile.toJSON(), postsByUser });
  } catch (err) {
    console.error(err.message);
    if (err.kind == 'ObjectId') {
      return res.status(400).json({ msg: 'Profile not found' });
    }
    res.status(500).send('Server error');
  }
});
xfb7svmp

xfb7svmp2#

即使在今天,这也是一个很有用的例子。除了错字:

const profile = await User.agregate([

应该是

const profile = await User.aggregate([

相关问题