Si uso Mongoose para ejecutar una consulta en un esquema que tiene una referencia a otro modelo (en este caso, un modelo de BlogPost con una propiedad author que hace referencia a otro modelo Author).
let posts = await BlogPost.find({}, "title author").populate("author","name bio").lean()Al pasar lean(), se supone que debo recuperar un POJO así:
[{ "_id": "602828eaff09bca9c3af2dbb", "author": { "_id": "602433bd98d380443ef9aeb7", "name": "Matt", "bio": "matt is cool" }, "title": "Hello World", "__v": 0 }, { "_id": "6048b8cb0200e51b4f2486c8", "author": { "_id": "602433bd98d380443ef9aeb7", "name": "Matt", "bio": "matt is cool" }, "title": "Another Blog post", "__v": 0 }]Sin embargo, si modifico por ejemplo
publicaciones[0].autor.nombre = "Prueba"
luego TODAS las publicaciones con este autor en la matriz se modifican:
[{ "_id": "602828eaff09bca9c3af2dbb", "author": { "_id": "602433bd98d380443ef9aeb7", "name": "Test", "bio": "matt is cool" }, "title": "Hello World", "__v": 0 }, { "_id": "6048b8cb0200e51b4f2486c8", "author": { "_id": "602433bd98d380443ef9aeb7", "name": "Test", "bio": "matt is cool" }, "title": "Another Blog post", "__v": 0 }]Si, en cambio, solo quisiera afectar el primer objeto de la matriz, ¿qué debo hacer?
La función de llenado en Mongoosehttps://mongoosejs.com/docs/api/query.html#query_Query-populate tiene una opción clone:true
[options.clone=false] «boolean» Cuando haces BlogPost.find().populate('author'), las publicaciones de blog con el mismo autor compartirán 1 copia de un documento de autor. Habilite esta opción para hacer que Mongoose clone los documentos completos antes de asignarlos.
Así que el código correcto sería algo como
let posts = await BlogPost.find({}, "title author").populate({path:"author", fields:"name bio", clone:true}).lean()Gracias a @buithienquyet en los comentarios por los consejos.