Mongodb обновить или вставить с Mongojak - Java

Я новичок в MongoDB и Mongojack, я пытаюсь обновить документ, если он уже завершен, или вставить новый документ. Для тестирования я использую приведенный ниже код, который является событием нажатия кнопки. Моя проблема заключается в том, что, когда я нажимаю кнопку в первый раз, она добавляет документ с сгенерированным идентификатором объекта, но когда я нажимаю снова, он добавляет другой документ с тем же идентификатором объекта. Я надеюсь сохранить только один документ в этой коллекции, обновляя каждый раз.

после прибегая к помощи я добавил @objectId аннотация к _id поле, но выдает ошибку с указанным ниже корневым аргументом;

любая помощь..

Модельный класс

public class Transport implements StockLoadable {
    // @ObjectId 
private String _id;
private String info;

public String getInfo() {
    return info;
}

public void setInfo(String info) {
    this.info = info;
}


public String get_id() {
    return _id;
}


public void set_id(String _id) {
    this._id = _id;
}

@Override
public String toString() {
    return "Vehicle";
}

@Override
public void setStock(Stock stock) {
    // TODO Auto-generated method stub

}

@Override
public Stock getStock() {
    // TODO Auto-generated method stub
    return null;
}

}

Событие нажатия кнопки

Transport transport;
btn.addClickListener(o->{
        if(transport==null){
        transport= new Transport();
        transport.setInfo("Info");
        }
        try (MongoClient mongoClient = new MongoClient("localhost",27017)) {
            DB db = mongoClient.getDB("transport");
            DBCollection table = db.getCollection("test");
            JacksonDBCollection<Transport, String> collection = JacksonDBCollection.wrap(table, Transport.class, String.class);
            WriteResult<Transport, String> result = collection.save(transport);
            System.out.println(result.getSavedId());
            transport= collection.findOne(DBQuery.is("_id",result.getSavedId()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

Исключение Root у меня после добавления аннотации

Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.introspect.Annotated.getType()Lcom/fasterxml/jackson/databind/JavaType;
at org.mongojack.internal.MongoAnnotationIntrospector.findDeserializer(MongoAnnotationIntrospector.java:86)
at com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair.findDeserializer(AnnotationIntrospectorPair.java:515)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findDeserializerFromAnnotation(BasicDeserializerFactory.java:1648)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.constructSettableProperty(BeanDeserializerFactory.java:721)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:498)

1 ответ

Я отвечаю на свой вопрос, который может быть полезен для других. Причиной дублирования документа является мое недопонимание процесса автоматической идентификации mongodb.

Если вам нужно разрешить БД выдавать идентификатор для вашего документа, то вы должны использовать org.bson.types.ObjectId тип поля с именем _id и оставь это пустым. Если вы хотите добавить идентификатор в качестве вашего выбора, то определите поле с типом, который вы хотите с именем _id и назначьте соответствующее значение для него. Если вы оставите поле пустым, Mongo добавит идентификатор типа ObjectId что вызовет последующие проблемы, как у меня.

Изменить тип _id поле из String в ObjectId решен проблемой. Но я не смог найти причину исключения. Просто удалили аннотации тоже.

Другие вопросы по тегам