创建新的猫鼬子文档并附加到现有的父文档

Creating new mongoose sub-doc and appending to existing parent doc

我正在使用 NodeJS、MongoDB、Express、Mongoose 等构建一个带有数据库的网站

  1. 我设置了两个模式:事件和子文档模式类别(以及其他)。
  2. 函数拉入数组,其中包含创建多个类别所需的数据(此位有效)以及附加到末尾的事件 ID。
  3. 下面的前几位只是获取该 ID,然后将其从数组中删除(可能是更好的方法,但同样有效)。
  4. 如上所述,类别然后正确创建(甚至进行验证),这太棒了,但是...
  5. 它们不会附加到事件文档中。该文档将“类别”字段更新为适用数量的“空”值,但我终究无法让它实际获取新创建类别的 ID。

我从某处获取(并调整)了以下代码,所以这就是我所在的位置...

     exports.addCategories = catchAsync(async (req, res, next) => {
       const categories = req.body;
       const length = categories.length;
       const eventID = categories[length - 1].eventId;
       categories.pop();

    Event.findOne({ _id: eventID }, (err, event) => {
      if (err) return res.status(400).send(err);
      if (!event)
        return res.status(400).send(new Error("Could not find that event"));

    Category.create(categories, (err, category) => {
      if (err) return res.status(400).send(err);

      event.categories.push(category._id);
      event.save((err) => {
        if (err) return res.status(400).send(err);

        res.status(200).json(category);
        });
      });
     });
    });

目前 mongoose 调试输出显示如下(这证实它的大部分工作正常,但只是没有正确提取 ID):

> Mongoose: events.updateOne({ _id: ObjectId("614bc221bc067e62e0790875")}, { '$push': { categories: { '$each': [ undefined ] } }, '$inc': { __v: 1 }}, { session: undefined })

没关系!我意识到“类别”仍然是一个数组,而不是我假设的类别数组的一个元素。

所以我用这个替换了那个部分,现在......它起作用了!

  Category.create(categories, (err, categories) => {
    if (err) return res.status(400).send(err);

    categories.forEach((category) => {
      event.categories.push(category._id);
    });

    event.save((err) => {
      if (err) return res.status(400).send(err);
    });
  });