He configurado flujos de mongo para una colección de productos a continuación, pero una actualización en cualquier campo del objeto de especificaciones devuelve el objeto de especificaciones completo en lugar del campo actualizado. Esperaría un cambio en el campo de visualización para devolver solo el campo de visualización en lugar de toda la colección de productos de objetos de especificaciones en mongo db
{ "productName": "Apple iPhone 5", "specs": { "network": "GSM / CDMA / HSPA / EVDO / LTE", "display": "IPS LCD", "memory": "16GB 1GB RAM" } } const productPipeline = [ { $project: { 'fullDocument.productName': 1, 'updateDescription.updatedFields.specs': 1, }, }, ]; const productChangeStream = this.productModel.watch(productPipeline, { fullDocument: 'updateLookup', }); productChangeStream.on('change', async (data) => { console.log(JSON.stringify(data, null, 2)); });Intenté usar el productPipeline a continuación, pero aún no funcionó
const productPipeline=[ { $project: { 'fullDocument.productName': 1, 'updateDescription.updatedFields.specs.network': 1, 'updateDescription.updatedFields.specs.display': 1, 'updateDescription.updatedFields.specs.memory': 1, }, }, ];Parece que el comportamiento se debe a la diferencia entre una operación de actualización y de reemplazo. MongoDB tiene dos formas de actualización; una actualización delta y un reemplazo de documento completo.
Los reemplazos se ven así:
db.coll.update({query for matching document}, {full replacement document}) OR db.collection.replaceOne({query for matching document}, {full replacement document})Las actualizaciones normales (delta) se ven así:
db.coll.update({query for matching document}, {$set: {individualField: newValue}})Si su aplicación está realizando reemplazos completos, el documento de reemplazo completo se registrará en el registro de operaciones. Dado que los flujos de cambios simplemente informan lo que ve en el registro de operaciones, esto producirá un evento de flujo de cambios con {operationType: "replace"} y una copia completa del nuevo documento.
Sin embargo, si realiza una actualización normal, solo se informarán los campos que se cambiaron; recibirá un evento de flujo de cambios con {operationType: "update"} y un campo llamado updateDescription que informa los campos que fueron modificados por la operación. Consulte esta página para obtener detalles sobre los eventos de actualización y reemplazo, y el campo updateDescription.
Por ejemplo, si inserto el documento de muestra que proporcionó anteriormente y luego ejecuto la siguiente actualización:
db.testing.updateOne({}, {$set: {"branding.control_panel.companyLogo.displayName": "1200px-Logo_NIKE_updated.svg"}})... luego recibo el siguiente evento de cambio (abreviado para mayor claridad):
{ "_id" : ..., "operationType" : "update", "clusterTime" : ..., "ns" : ..., "documentKey" : ..., "updateDescription" : { "updatedFields" : { "branding.control_panel.companyLogo.displayName" : "1200px-Logo_NIKE_updated.svg" }, "removedFields" : [ ] } }Aquí está el problema de Jira