node.js - Model.find({_id:req.body.id}) 找到对象但是 Model.updateOne({_id:req.body.id},{//update}) 没有找到对象
问题描述
app.post("/admin/editAssignedTask/:id", (req, res) => {
Task.findById(req.params.id, (err, task) => {
task.title = req.body.title;
task.priority = req.body.priority;
task.date = new Date(req.body.date);
task.description = req.body.description;
if (req.body.assignTo) {
console.log(req.body.assignTo);
if (typeof req.body.assignTo == "string") {
task.assignedTo = [...task.assignedTo, req.body.assignTo];
Staff.find({ _id: req.body.assignTo }, (err, staff) => {
console.log(staff);
});
Staff.updateOne(
{ _id: req.body.assignTo },
{ $set: { $push: { todo: req.params.id } } },
(err, up) => {
console.log(up);
}
);
在上面的代码中,staff.find() 返回
[ { todo: [ 5cc44b02abde080691893e41, 5cc46186db0195071f117808 ],
completed: [],
_id: 5cc34724ab9d2d231642f925,
name: 'gokul',
mailId: 'gokul',
__v: 12 } ]
但是 staff.updateOne() 返回 { ok: 0, n: 0, nModified: 0 } 这里 n 是 0 这意味着没有匹配的对象。!为什么会这样?
下面是员工模式
var userSchema = new mongoose.Schema({
name: String,
mailId: String,
todo: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Task"
}
],
completed: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Task"
}
]
});
解决方案
改变
Staff.updateOne(
{ _id: req.body.assignTo },
{ $set: { $push: { todo: req.params.id } } },
(err, up) => {
console.log(up);
}
);
至
Staff.updateMany(
{ _id: { $in: req.body.assignTo } },
{ $push: { todo: mongoose.Types.ObjectId(req.params.id) } },
(err, up) => {
console.log(up);
}
);
1) 不要使用 $set 来推送或拉取数组元素。
2) 因为在模式中,属性 'todo' 是一个 objectIDs 数组而不是字符串,我们需要使用 mongoose.Types.ObjectId() 将字符串显式转换为 objectIDs
推荐阅读
- firebase - Flutter firebase_database - DatabaseReference runTransaction - 同时交易 - 两者都通过
- powershell - 为什么字符串显示长度为 1?
- r - R - 基于来自另一列的部分字符串匹配添加新列
- sql - 从日期范围生成销售事实数据
- r - 基于条件 R 的观测子集问题
- typescript - 打字稿 - 创建新类型,不包括“从不”类型的道具
- authentication - Vertx Sockjs Eventbus 处理程序授权
- node.js - 将 React 连接到两个单独的服务器
- php - 我可以在没有 Web 服务器的情况下运行 PHP
- google-bigquery - 为什么 BigQuery 表的上次修改日期与上次插入日期不匹配?