首页 > 解决方案 > 更新 MERN 堆栈中的模式

问题描述

我有一个用户模式模型,其中address(应该)通过地址模式模型填充该字段。为了更新我在请求正文中传递的地址架构,并userId通过从req.user. 我可以向地址字段添加新条目,但是当我查看 Atlas 中的用户模型时,它没有被填充。

我的假设是它会根据用户的 ID 自动填充它,但事实并非如此。我是不是搞错了?

路线:

const addAddress = async (req, res) => {
  try {
    console.log(req.body);
    // Destruct Request
    const { name, street, city, state, zipcode } = req.body;

    // Define User ID
    const user = req.user.id;

    const addUserAddress = await User.findById(user, (error, address) => {
      if (error) {
        return res
          .status(500)
          .json({ success: false, message: 'An unexpected error occurred.' });
      }

      let newAddress = new Address({
        _userId: user,
        name,
        street,
        city,
        state,
        zipcode,
      });

      newAddress.save((err0r) => {
        if (error) {
          return res
            .status(500)
            .json({ success: false, message: 'An unexpected error occurred.' });
        }
      });
    });
    res.json(addUserAddress);
  } catch (error) {
    console.error(error);
    res.status(500).send('Error adding an address, please try again.');
  }
};

地址型号:

const AddressSchema = new mongoose.Schema({
  _userId: {
    type: ObjectId,
    required: true,
    ref: 'User',
  },
  name: {
    type: String,
    required: true,
    unique: false,
  },
  street: {
    type: String,
    required: true,
    unique: false,
  },
  city: {
    type: String,
    required: true,
    unique: false,
  },
  state: {
    type: String,
    required: true,
    unique: false,
  },
  zipcode: {
    type: String,
    required: true,
    unique: false,
  },
});

const Address = mongoose.model('Address', AddressSchema);

exports.Address = Address;

用户模型:

const UserSchema = new mongoose.Schema({
  ...
  address: [
    {
      type: ObjectId,
      ref: 'Address',
    },
  ],
  ...
});

标签: node.jsmongodbexpressmongoosemern

解决方案


ID 被插入,但信息不会自动填充。为了填充信息,您必须执行以下操作...

const usersWithAddress = await User.find({}).populate("address", "city state zip", Address) // Pass in the Address model as the 3rd argument.

填充将在没有地址模型的情况下工作,但我过去有时没有传递它时遇到问题。


推荐阅读