Data de muestra:
{ _id: , instances: [ { instance_id: ObjectId() } ] }
Necesito convertir a ObjectId a formato String en la matriz de instancias.
se me ocurrió la siguiente consulta
db.test.update( {'_id': {'$in': ['1054605|2347', '1053095|2404']}}, [ { $set: { i: { $map: { input: "$instances", as: "instance", in: { $mergeObjects: [ "$$instance", { instance_id: { $cond: { if: { $eq:[ { $type: "$$instance.instance_id"} , "objectId"] }, then: { $convert:{ input: "$$instance.instance_id", to: "string" } }, else: "$$instance.instance_id" } } } ] } } } } } ])
Pero la consulta anterior funciona solo para un documento. Pero no funciona en varios documentos, simplemente dice 0 documentos actualizados.
¿Alguna sugerencia por favor?
Está utilizando el método de actualización :
De forma predeterminada, el método db.collection.update() actualiza un solo documento. Incluya la opción multi: true para actualizar todos los documentos que coincidan con los criterios de consulta.
Todo lo que tiene que hacer es agregar el indicador multi: true
a las opciones de actualización, así:
db.collection.update( <query>, <update>, { multi: true, } )
Entonces, el problema aquí es la función Model.update()
La función Update()
actualiza un objeto, pero ese comportamiento se puede anular agregando multi: true
a la función de actualización como se menciona en la documentación aquí .
Habiendo dicho eso, también puede usar un enfoque más "limpio" para la situación usando updateMany()
en lugar de update()
con multi: true
.
updateMany()
es lo mismo que update()
, excepto que MongoDB actualizará todos los documentos que coincidan con el filtro independientemente del valor de la opción múltiple.
Esto ofrecería una pieza de código más limpia y legible. La documentación para updateMany()
se puede encontrar aquí .