Проверьте, есть ли ошибка в update/insert | Java-драйвер MongoDB

Я хочу проверить, не проходит ли insert (из-за уникального = истинного индекса в коллекции). Если есть ошибка, сделайте что-нибудь. Ниже приведен пример моего кода.

DBCollection user...;
BasicDBObject Doc = new BasicDBObject(... );

String user_exists = user.insert(Doc).getError(); //insert the doc get error if any
if(user_exists!=null){ //any errors?
    user.update(new BasicDBObject(...)); // error exists so do smthng
}

Вышеупомянутое как есть не работает. Я считаю, что String user_exists всегда равно нулю. Как я могу заставить вышеперечисленное работать?


Я видел похожие вопросы SO и упоминал WriteConcern, который может пройти в insert(). Например.

coll.insert(dbObj, WriteConcern.SAFE);

источники: SO question или документы Mongo

Однако я не знаю, какое поле я должен передать (SAFE, ACKNOWLEDGED, UNACKNOWLEDGED и т. д.), чтобы получить ошибку. Может быть, я указал в неправильном направлении.

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


person Diolor    schedule 05.02.2014    source источник
comment
Не могли бы вы перефразировать Однако я не знаю, какое поле мне следует передать или обработать остальные. так как смысла мало   -  person Martin    schedule 06.02.2014
comment
@Мартин Обновлено. Теперь стало понятнее?   -  person Diolor    schedule 06.02.2014
comment
Да, различные поля WriteConcern описаны в api.mongodb.org. /java/current/com/mongodb/   -  person Martin    schedule 06.02.2014
comment
com.mongodb.MongoException.DuplicateKey неизбежен, если dbObj, который вы пишете, нарушает какое-то ограничение уникального ключа. То есть как раз сейчас драйвер Mongo работает. Мы всегда здесь WriteConcern.SAFE.   -  person Bob Kuhar    schedule 06.02.2014


Ответы (1)


Если вы используете WriteConcern.ACKNOWLEDGED (что, я думаю, также SAFE), вам не нужно загрязнять свой код проверкой ошибок.

Для ACKNOWLEDGED драйвер автоматически выдаст команду getLastError и вызовет исключение, если что-то пойдет не так, например, нарушение дублирующегося индекса.

Начиная с версии 2.10 драйвера Java, проблемой записи по умолчанию является ACKNOWLEDGED.

ИЗМЕНИТЬ

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

Не стоит этого делать, но в любом случае:

Метод insert действительно возвращает WriteResult. Если getError() это null, все в порядке, иначе возвращает что-то вроде E11000 duplicate key error index:.... Чтобы это работало, вам нужно будет использовать WriteConcern.UNACKNOWLEDGED

person Ori Dar    schedule 05.02.2014
comment
Мило, но как я могу запустить .update()? Я все еще хочу запустить его, если что-то пойдет не так :) - person Diolor; 06.02.2014
comment
Кто-нибудь знает, задокументировано ли это где-нибудь на страницах MongoDB? Я не мог найти его. - person Yngve Sneen Lindal; 18.07.2014
comment
Найдите дополнительную информацию о здесь и документацию по сохранению. на api.mongodb.org/java/current/com/mongodb/DBCollection .html ; обратите внимание, что выбрасывается MongoExcption, и он распространяется из RuntimeException - person Russ Jackson; 28.09.2014