javascript - 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);
解决方案
我发现了我犯的错误。我正在尝试比较对象,这实际上是不可能的。我得到了数组的索引,然后提取了我需要的数据并将其存储到 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");
}
});
推荐阅读
- c# - 如何让 Visual Studio 2019 格式化/重构变量名?
- python - Pandas:如何将标题名称和列一一分割为 \t?
- c - 在c和linux上通过socket连接两台计算机
- c - C 编程错误二进制 int 和 long long 无符号整数的无效操作数
- java - addSnapshotListener 再次获取所有数据,而不是唯一的更改
- javascript - Javascript 正则表达式格式编号
- c# - 如何检查列表包含多少元素?C#
- swift - 如何在故事板中创建的 UILabel 上换行文本?
- excel - 如果输入的时间段多于 EXCEL-VBA 中的特定值,如何复制最后一个特定数量的值
- laravel - laravel 8 ->为具有多态关系的帖子添加评论和回复