MongoDB only updates partially

Viewed 46

My model has "id", "liked", "likedBy" and "matched" fields. I can update my database and add id according to my hypotethical likes; it stores target's id to my current user's liked field, current user's id to target's likedBy field. I'm trying to achieve, if a user has both liked and likedBy id matching then put liked id to my matched field on both users, but I can't for some reason. It just doesn't care if statement there.

Any ideas why?

//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");
  }
});

My Schema:

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);
1 Answers

I found the mistake I made. I'm trying to compare objects, which isn't possible really. I got index of my array then extracted the data I need and stored it into value1 & value2.

I found my mistake the moment I console.log'ed my conditions as below:

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

Working version:

//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");
  }
});
Related