#java #mongodb #pull
#java #mongodb #тянуть
Вопрос:
У меня есть коллекция с именем Entity, и ниже приведена схема для нее
Entity {
Owner {
id
}
Tags [
{id :
name : }
{id :
name : }
]
}
Я пытаюсь извлечь объекты с соответствующим идентификатором владельца и идентификатором тега, а затем удалить тег из объектов
BasicDBObject query = new BasicDBObject("Tags.id", tagId).append("Owner.id", ownerId);
BasicDBObject updQuery = new BasicDBObject("$pull",
new BasicDBObject("Tags", new BasicDBObject("id", tagId)));
updQuery.update(query, updQuery, true);
где entities — это экземпляр MongoJackDaoImpl.
Когда я пытаюсь получить пустой результат, соответствующий идентификатору тега и идентификатору владельца, я получаю следующее исключение
com.mongodb.WriteConcernException: Write failed with error code 16836 and error message 'Cannot apply $pull to a non-array value'
at com.mongodb.operation.BaseWriteOperation.convertBulkWriteException(BaseWriteOperation.java:239)
Есть ли какой-либо способ проверить наличие пустого результата в запросе обновления, чтобы избежать ошибки?
Ответ №1:
Ошибка произошла из-за того, что для UPSERT было установлено значение false, из-за чего обновление не удалось, когда из запроса select были возвращены пустые записи.
Приведенный выше код исправлен путем установки логического значения UPSERT в true в конструкторе BasicDBObject
BasicDBObject updQuery = new BasicDBObject("$pull",
new BasicDBObject("Tags", new BasicDBObject("id", tagId)));
updQuery.update(query, updQuery, true, true);