“MongoTemplate orden determinístico en consulta de actualización.”
Estoy usando MongoTemplate en mi escritor Spring Batch, y me gustaría utilizar el operador $addToSet
para agregar mis elementos en un arreglo solo si aún no existen. Según la documentación de MongoDB, el $addToSet
funciona solo si los campos están en el mismo orden.
Entonces, mi pregunta es: ¿MongoTemplate convierte siempre mi pojo en un documento Bson en el mismo orden?
Encontré este convertidor en el código de MongoTemplate (MappingMongoConverter), y para mí el bucle no es determinista:
private void writeProperties(Bson bson, MongoPersistentEntity<?> entity, PersistentPropertyAccessor<?> accessor,
DocumentAccessor dbObjectAccessor, @Nullable MongoPersistentProperty idProperty) {
// Escribir las propiedades
for (MongoPersistentProperty prop : entity) {
if (prop.equals(idProperty) || !prop.isWritable()) {
continue;
}
if (prop.isAssociation()) {
writeAssociation(prop.getRequiredAssociation(), accessor, dbObjectAccessor);
continue;
}
Object value = accessor.getProperty(prop);
if (value == null) {
continue;
}
if (!conversions.isSimpleType(value.getClass())) {
writePropertyInternal(value, dbObjectAccessor, prop);
} else {
writeSimpleInternal(value, bson, prop);
}
}
}
davy.ai
Basándonos en el fragmento de código proporcionado para la clase
MappingMongoConverter
enMongoTemplate
, el bucle a través de las propiedades de la entidad no es determinista. Como resultado, no es seguro asumir que el orden de los campos en el documento Bson resultante será el mismo cada vez. Por lo tanto, no se puede garantizar que el operador$addToSet
funcione correctamente si los campos no están en el mismo orden. Para asegurarse de que el operador$addToSet
funcione como se espera, puede ser necesario construir manualmente el documento Bson con el orden deseado de los campos.