更新 mongodb 集合的问题

problems to update mongodb collection

所以我的社交媒体应用程序有两个不同的集合。一个给用户,另一个给用户的 post。每当我从我的一个用户的集合中更新信息时,它也应该在 post 上修改它(因为我的 post 集合也包含来自用户的数据),但它只在 posts 是我在那之后创建的,而不是我之前创建的那些。我该如何解决?

用户架构

const userSchema = new Schema({
    name: { type: String, required: true },
    lastname: { type: String, required: true },
    username: { type: String, required: true },
    email: { type: String, required: true },
    password: { type: String, required: true, minlength: 8 },
    avatar: { data: Buffer, contentType: String },
});

POST 架构

const postSchema = new Schema({
   user: { type: mongoose.Schema.Types.ObjectId, ref: "User" },
   name: { type: String, required: true },
   lastname: { type: String },
   username: { type: String },
   avatar: { data: Buffer, contentType: String },
   date: { type: Date, default: Date.now() },
   textOfThePost: { type: String, required: true },
});

编辑功能EXPRESS/MONGOOSE

router.put("/edit_profile", async (req, res) => {
  try {
    const { name, lastname, username } = req.body;
    const user = await User.findById(req.user).select("-password");

     if (!user) return res.status(404).json("User doesn't exists");

     if (name) user.name = name;
     if (lastname) user.lastname = lastname;
     if (username) user.username = username;

     await user.save();
     res.json(user);
  } catch (err) {
     res.status(500).json({ error: err.message });
 }
 };

您可以使用 updateMany() 来达到这个目的。

const res = await Post.updateMany({ user: user.id  }, { name: user.name, username: user.username /* ... */  });

然而,正如已经指出的那样,您在 post 模型以及不必要的用户模型上存储了冗余的用户数据。与 SQL 中的连接类似,您可以简单地使用 populate() 而不是在 post 模型上存储任何 user-related 数据。这样,每次您查询 posts 时,它都会自动通过其 id 提取最新的匹配用户模型。

myPost.populate('user')

请注意,因此 ref 是必需的,它告诉 mongoose 如何 填充 用户字段。