mongoose 使用请求中的指定数据更新数组中的多个或单个对象

km0tfn4u  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(118)

我对MongoDB的先进技术不太在行。我在MongoDB收藏中的记录是:

{
    "_id": ObjectId("1"),
    "manager": ObjectId("12345"),
    "code": "PS",
    "title": "Performance System",
    "users": [
        {
            "_user": ObjectId("1"),
            "role": "Member",
        },
        {
            "_user": ObjectId("2"),
            "role": "Member",
        },
        {
            "_user": ObjectId("3"),
            "role": "Member",
        }
    ],
}

节点. js/快速JS

我创建了API来更新阵列,如下所示,但没有工作。

const updateProjectMember = asyncHandler(async (req, res) => {
  const { userID, role } = req.body.userData;

  try {
    const project = await Project.updateMany(
      { _id: req.params.projectID },
      { $set: { "users.$[selectedUser].role": role } },
      { arrayFilters: { "selectedUser._user": { $in: userID } } }
    );
    res.status(200).json(project);
  } catch (error) {
    res.status(400);
    throw new Error(error);
  }

我使用API参数来获取项目ID。

{
  userID : ["2","3"];
  role: "Admin"
}

因此,API将获取一个要匹配的userID数组,并将所有“role”字段设置为“Admin”以匹配所有用户。
我希望数据是这样的:

{
    "_id": ObjectId("1"),
    "manager": ObjectId("12345"),
    "code": "PS",
    "title": "Performance System",
    "users": [
        {
            "_user": ObjectId("1"),
            "role": "Member",
        },
        {
            "_user": ObjectId("2"),
            "role": "Admin",
        },
        {
            "_user": ObjectId("3"),
            "role": "Admin",
        }
    ],
}

我做的练习正确吗?如果是糟糕的练习,解决这个问题的最好方法是什么?

ffvjumwh

ffvjumwh1#

查询是好的,只要确保传递的值与MongoDB文档中的类型完全相同即可。

var mongoose = require('mongoose');

const updateProjectMember = asyncHandler(async (req, res) => {
  const { userID, role } = req.body.userData;
  userID = userID.map(x => mongoose.Types.ObjectId(x));

  try {
    const project = await Project.updateMany(
      { _id: mongoose.Types.ObjectId(req.params.projectID) },
      { $set: { "users.$[selectedUser].role": role } },
      { arrayFilters: { "selectedUser._user": { $in: userID } } }
    );
    res.status(200).json(project);
  } catch (error) {
    res.status(400);
    throw new Error(error);
  }
}

相关问题