es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Garantizar el orden de los campos en un documento de MongoDB utilizando el controlador de Java para MongoDB.

Usando el controlador MongoDB 4.1.0 (y quarkus 1.1.1), tengo una entidad con un _id compuesto:

@BsonId
@JsonProperty("_id")
private CompositeId id = new CompositeId();

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class CompositeId {
    @BsonProperty("b")
    private int b;
    @BsonProperty("a")
    private String a;
}

(donde a es en realidad una cadena hexagonal de ObjectId)

Después de guardar la entidad, los campos _id se conservan en orden alfabético:

"_id" : {
    "a" : "61a480509da3560292eb1ab5",
    "b" : 1234
},

Más tarde, la misma entidad lógica se actualiza en otro lugar utilizando pymongo:

collection.update_one({'_id': id}, {'$set': ...

El id en el documento de consulta se construye con python OrderedDict, con b como primero en orden, y a como segundo.

Entonces termino con dos documentos idénticos en la colección, diferentes solo en el orden de los campos _id:

{
    "_id" : {
        "a" : "61a480509da3560292eb1ab5",
        "b" : 1234
    },
    // resto de campos idénticos para el documento insertado de Java
}
{
    "_id" : {
        "b" : 1234,
        "a" : "61a480509da3560292eb1ab5"
    },
    // resto de campos idénticos para el documento actualizado de Python
}

Entonces, mi pregunta es, ¿hay alguna manera de configurar el controlador de Java para conservar el orden de los campos en el documento (algo así como @JsonPropertyOrder) o, menos realista, utilizando la configuración de quarkus/panache?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hasta donde yo sé, el controlador MongoDB para Java no proporciona una opción de configuración para preservar el orden de los campos en un documento. Esto se debe a que la especificación BSON no garantiza ni requiere un orden específico de los campos en un documento BSON. De hecho, el servidor MongoDB tampoco preserva el orden de los campos en un documento.

    La razón por la cual está viendo diferentes órdenes de campos en sus documentos se debe a que está usando diferentes controladores, cada uno con sus propias convenciones de orden de campos. El controlador de Java ordena los campos alfabéticamente por nombre de campo, mientras que el controlador PyMongo preserva el orden de los campos en el documento original.

    Si necesita asegurar un orden específico de campos en sus documentos, puede usar un BsonDocument en lugar de un POJO para sus entidades. Un BsonDocument le permite especificar el orden de los campos explícitamente, utilizando el método append(). Sin embargo, esto requeriría cierta serialización y deserialización manual de sus entidades.

    Alternativamente, si desea mantenerse con los POJO, podría escribir un serializador y deserializador personalizado que preserve el orden de los campos en sus objetos Java. Podría usar la biblioteca Jackson, que es usada por el controlador de Java para la serialización JSON, e implementar las interfaces Serializer y Deserializer. Sin embargo, esto requeriría algún código y configuración adicional por su parte.

Comments are closed.