Estoy intentando realizar una actualización usando un substr después de migrar desde mongo> documentDB, sin embargo, recibo un error extraño.
Lo siguiente funciona en Mongo 4.0 usando pymongo:
await db[cls.colname].update_many( {'$or': [{'preview_title': {'$exists': False}}, {'preview_title': None}]}, [{'$set': {'preview_title': {'$substr': ['$title', 0, 70]}}}], )
El comando equivalente de mongo shell también funciona:
db.getCollection('pages').updateMany({'$or': [{'preview_title': {'$exists': false}}, {'preview_title': null}]}, [{'$set': {'preview_title': {'$substrBytes': ['$title', 0, 70]}}}])
Sin embargo, después de cambiar a AWS DocumentDB, no acepta la actualización como una matriz o devolverá este error: "MongoError: tipo incorrecto para la imagen del parámetro u"
Si cambio el comando al siguiente, funcionará (básicamente, simplemente elimine los corchetes de la parte de actualización):
db.getCollection('pages').updateMany({'$or': [{'preview_title': {'$exists': false}}, {'preview_title': null}]}, {'$set': {'preview_title': {'$substr': ['$title', 0, 70]}}})
Esto estaría bien, sin embargo, la llamada pymongo equivalente no parece funcionar:
await db[cls.colname].update_many( {'$or': [{'preview_title': {'$exists': False}}, {'preview_title': None}]}, {'$set': {'preview_title': {'$substr': ['$title', 0, 70]}}}, )
Devuelve el siguiente error: pymongo.errors.WriteError: el documento no puede tener nombres de campo con prefijo $: $substr
Pasar una matriz como actualización se denomina "actualizar con una canalización de agregación". Aparentemente, DocumentDB no implementa eso (entre un montón de otras características de MongoDB).
Cuando elimina la matriz de la actualización, cambia de usar https://docs.mongodb.com/manual/reference/operator/aggregation/set/ a usar https://docs.mongodb.com/manual/reference/operator/update /conjunto/ . Notará que el $set de actualización no acepta expresiones como lo hace el $set de agregación. Entonces, su actualización de shell con $set escribe un documento (anidado) {'$substr': ['$title', 0, 70]}
en el campo de preview
. Por lo general, las claves que comienzan con dólares no se pueden consultar porque los operadores de MongoDB utilizan el prefijo dólar, por lo que escribir un documento de este tipo en un campo es una mala idea. Pymongo te dice esto y rechaza la operación. El shell lo permite porque también lo usan internamente los ingenieros del servidor MongoDB para realizar pruebas y, por lo tanto, permite que se hagan varias cosas extrañas/inusuales.