Supuestamente, quiero actualizar los valores de objeto de la matriz de un documento, pero primero tendré que buscar su identificación primero, aquí está la estructura del documento
{ _id: ObjectId('12312') notifications: [ { _id: ObjectId('1') status: 'unread' }, { _id: ObjectId('2') status: 'unread' }, { _id: ObjectId('3') status: 'unread' } ] }Quiero actualizar el estado de las notificaciones bajo ese usuario donde el objectId debe ser igual dentro de la matriz de resultados
result = [ new ObjectId("1"), new ObjectId("2"), ]esto debería producir este resultado después de la actualización
{ _id: ObjectId('12312') notifications: [ { _id: ObjectId('1') status: 'read' }, { _id: ObjectId('2') status: 'read' }, { _id: ObjectId('3') status: 'unread' } ] }Esto es lo que he hecho hasta ahora, pero no obtengo el resultado que necesito.
const updateuser = await User.updateMany({_id:idofuser, "notifications._id": { $in : result }},{ $set: { "notifications.$.status": "read", } })Puede usar $map para recorrer notifications y usar $cond y $mergeObjects para realizar la actualización condicional.
db.collection.update({ "_id": "12312" }, [ { "$set": { "notifications": { "$map": { "input": "$notifications", "as": "n", "in": { "$cond": { "if": { "$in": [ "$$n._id", [ "1", "2" ] ] }, "then": { "$mergeObjects": [ "$$n", { "status": "read" } ] }, "else": "$$n" } } } } } } ], { multi: true })Aquí está el Mongo Playground para su referencia.