首页 > 解决方案 > MongoDB 仅部分更新

问题描述

我的模型有“id”、“liked”、“likedBy”和“matched”字段。我可以根据我的假设更新我的数据库并添加 id;它将目标的 id 存储到我当前用户的喜欢字段,当前用户的 id 存储到目标的 likeBy 字段。我正在努力实现,如果用户同时喜欢和喜欢的 id 匹配,那么将喜欢的 id 放到两个用户的匹配字段中,但由于某种原因我不能。它只是不在乎那里的陈述。

任何想法为什么?

//like user by using it's id. update it to liked
app.put("/like/:id", auth, async (req, res) => {
  try {
    const user = await User.findById(req.params.id);
    const loggedUser = await User.findById(req.user.id).select("-password");
    //check if it is already liked
    if (
      user.likedBy.filter((like) => like.user.toString() === req.user.id)
        .length > 0
    ) {
      return res.status(400).json({ msg: "Already Liked" });
    }
    user.likedBy.unshift({ user: req.user.id });
    loggedUser.liked.unshift({ user: req.params.id });
    
    await user.save();
    await loggedUser.save();
    //check matching
    if (user.likedBy === user.liked) {
      user.matched.unshift({ user: req.user.id });
    }
    
    await user.save();
    await loggedUser.save();
    res.status(200).send("Liked!");
  } catch (err) {
    console.error(err.message);
    res.status(500).send("Server Error");
  }
});

我的架构:

const mongoose = require("mongoose");

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  firstname: {
    type: String,
    required: true,
  },
  lastname: {
    type: String,
    required: true,
  },
  picture: {
    data: Buffer,
    contentType: String,
  },
  age: {
    type: Number,
    required: true,
  },
  gender: {
    type: String,
    required: true,
  },
  job: {
    type: String,
    required: true,
  },
  desc: {
    type: String,
    default: "Hasn't written anything yet.",
  },
  liked: [{}],
  likedBy: [{}],
  matched: [{}],
});

module.exports = User = mongoose.model("user", UserSchema);

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


我发现了我犯的错误。我正在尝试比较对象,这实际上是不可能的。我得到了数组的索引,然后提取了我需要的数据并将其存储到 value1 和 value2 中。

当我控制台记录我的条件时,我发现了我的错误,如下所示:

if(console.log(user.liked) === console.log(user.likedBy)){
...}

工作版本:

//like user by using it's id. update it to liked
app.put("/like/:id", auth, async (req, res) => {
  try {
    const user = await User.findById(req.params.id);
    const loggedUser = await User.findById(req.user.id).select("-password");
    //check if it is already liked
    if (
      user.likedBy.filter((like) => like.user.toString() === req.user.id)
        .length > 0
    ) {
      return res.status(400).json({ msg: "Already Liked" });
    } else {
      user.likedBy.unshift({ user: req.user.id });
      loggedUser.liked.unshift({ user: req.params.id });
      await user.save();
      await loggedUser.save();

      const value1 = user.likedBy[0].user;
      const value2 = user.liked[0].user;

      if (value1 === value2) {
        user.matched.unshift({ user: req.user.id });
        loggedUser.matched.unshift({ user: req.params.id });
        await user.save();
        await loggedUser.save();
        res.status(200).send("Liked & Matched!");
      } else {
        res.status(200).send("Liked!");
      }
    }
  } catch (err) {
    console.error(err.message);
    res.status(500).send("Server Error");
  }
});

推荐阅读