Детерминированный порядок MongoTemplate в запросе обновления

#java #mongodb #spring-data #spring-batch #spring-mongodb

#java #mongodb #spring-данные #весенний замес #spring-mongodb

Вопрос:

Я использую MongoTemplate в моем Spring Batch writer, и я хотел бы использовать $addToSet оператор для перемещения моих элементов в массив, только если они еще не существуют. Я вижу в документации Mongodb, что это $addToSet работает только в том случае, если поля расположены в одном и том же порядке.

Итак, мой вопрос: MongoTemplate преобразует мой pojo в документ Bson всегда в одном и том же порядке?

Я нашел этот конвертер в коде MongoTemplate ( MappingMongoConverter ), и для меня цикл не является детерминированным :

 private void writeProperties(Bson bson, MongoPersistentEntity<?> entity, PersistentPropertyAccessor<?> accessor,
        DocumentAccessor dbObjectAccessor, @Nullable MongoPersistentProperty idProperty) {

    // Write the properties
    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);
        }
    }
}
 

Комментарии:

1. «Я вижу в документации Mongodb, что $addToSet работает только в том случае, если поля расположены в одном и том же порядке». — Я вижу, что в руководстве MongoDB такого правила не упоминается. $addToSet оператор обновления добавляет элемент в поле массива, только если элемент не существует.

2. Из docs.mongodb.com/manual/reference/operator/update/addToSet : «Если значением является документ, MongoDB определяет, что документ является дубликатом, если существующий документ в массиве точно соответствует добавляемому документу; т. е. Существующий документ имеет точно такие же поля и значения, и поля расположены в том же порядке . Таким образом, порядок полей имеет значение, и вы не можете указать, что MongoDB сравнивает только подмножество полей в документе, чтобы определить, является ли документ дубликатом существующего элемента массива «.

3. Это для сценария, в котором элемент поля массива является вложенным документом (или объектом).

4. Да, это мой случай, массив содержит документы, поэтому я спрашиваю о порядке «сортировки» MongoTemplate. Извините, если это было непонятно.

Ответ №1:

@Field Аннотации Spring Mongo позволяют явно задать порядок каждого поля.

Некоторые из моих POJO имеют 1000 полей, в моем случае это трудоемкое решение, но это решение. Если кто-то знает более простой способ, я буду благодарен 🙂

источник : https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/mapping/Field.html