Создание обновления ArrayFilters в Spring Data MongoDB с MongoOperation - PullRequest
0 голосов
/ 29 марта 2020

Я использую Spring boot 2.2.1.RELEASE. Как я могу написать приведенный ниже запрос на обновление MongoDB с Spring MongoOperation

db.cities.updateOne(
  {
    _id : ObjectId("5e78ec62bb5b406776e92fac")
  },
  { 
    $inc: { 
      "subscriptions.$[category].subscribers" : 1,
      "subscriptions.$[category].options.$[option].subscribers" : 1
    }
  },
  { multi: true,
    arrayFilters: [
      { "category._id": {$in: ["1", "2"]} },
      { "option.name": {$in: ["Time", "Gourmand", "Politics", "Entrepreneurship"]} } 
    ]
  }
)

Я пробовал следующее

Update update = new Update().inc("subscriptions.$[category].subscribers", 1).inc("subscriptions.$[category].options.$[option].subscribers", 1).filterArray(Criteria.where("category._id").in(Arrays.asList("1", "2")).andOperator(Criteria.where("option.name").in(Arrays.asList("Time", "Gourmand", "Politics", "Entrepreneurship"))));
UpdateResult result = mongoOperations.updateFirst(new Query(where("id").is(cityId)), update, CitiesDoc.class);

Но я продолжаю получать следующую ошибку

org.springframework.dao.InvalidDataAccessApiUsageException: команда не выполнена с ошибкой 9 (FailedToParse): «Нераспознанное поле в операции обновления: arrayFilters» на локальном хосте сервера: 56740. Полный ответ: {"ok": 0.0, "errmsg": "Нераспознанное поле в операции обновления: arrayFilters", "code": 9, "codeName": "FailedToParse"}; вложенное исключение: com.mongodb.MongoCommandException: команда завершилась с ошибкой 9 (FailedToParse): «Нераспознанное поле в операции обновления: arrayFilters» на локальном сервере: 56740. Полный ответ: {"ok": 0.0, "errmsg": "Нераспознанное поле в операции обновления: arrayFilters", "code": 9, "codeName": "FailedToParse"}

Не уверен для какого поля это дает ошибку. Некоторые предложения будут полезны.

1 Ответ

0 голосов
/ 30 марта 2020

Он работал со следующим запросом

update = update.inc("subscriptions.$[category].subscribers", 1);
update = update.inc("subscriptions.$[category].options.$[option].subscribers", 1);
update = update.filterArray(Criteria.where("category._id").in(Arrays.asList("1", "2")));
update = update.filterArray(Criteria.where("option.name").in(Arrays.asList("Time", "Gourmand", "Politics", "Entrepreneurship")));

UpdateResult result = mongoOperations.updateFirst(new Query(where("id").is(cityId)), update, CitiesDoc.class);

Но причиной ошибки была версия MongoDB. Я использую flabdoodle в качестве встроенного MongoDB для тестирования. И версия MongoDB по умолчанию - 3.5.5. Который, я считаю, не поддерживает arrayFilters. Обновление версии до 4.x решило проблему. Вы можете посмотреть в этом ответе , как обновить версию до последней поддерживаемой рабочей версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...