Запрос обновления MongoDB возвращает «Невозможно применить $pull к значению, отличному от массива»

#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);