No soy muy bueno con la técnica avanzada de MongoDB. Mi registro en mongo db collection
{ "_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", } ], }Creé una API para actualizar la matriz como se muestra a continuación, pero no funcionó.
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); }Uso el parámetro API para obtener la ID del proyecto. Aquí los datos del cuerpo de la solicitud
{ userID : ["2","3"]; role: "Admin" }Entonces, la API obtendrá una matriz de ID de usuario para que coincida y establecerá todos los campos de "rol" en "Administrador" para que coincidan.
Quería que los datos fueran así.
{ "_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", } ], }¿Estoy haciendo la práctica correcta? Si es una mala práctica, cuál es la mejor manera de resolver esto.
La consulta esta bien. Solo asegúrese de pasar el valor con el tipo exacto como en el documento 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); } }