Я нашел ответ Нейла полезным для решения этой проблемы, но я хотел предложить несколько иной вызов, чем тот, что был в его фрагменте кода.

отаю на Mongodb 3.6, с драйвером Монго 3.4.3 и данных весны Монго 1.5.10. Ниже приведена структура моего документа

{
  "_id": 12345,
  "_class": "com.example.ProductRates",
  "rates": [
    {
      "productId": NumberInt(1234),
      "rate": 100.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201801)
    },
    {
      "productId": NumberInt(1234),
      "rate": 200.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201802)
    },
    {
      "productId": NumberInt(1234),
      "rate": 400.0,
      "rateCardId": NumberInt(2),
      "month": NumberInt(201803)
    },
    {
      "productId": NumberInt(1235),
      "rate": 500.0,
      "rateCardId": NumberInt(1),
      "month": NumberInt(201801)
    },
    {
      "productId": NumberInt(1235),
      "rate": 234,
      "rateCardId": NumberInt(2),
      "month": NumberInt(201803)
    }
  ]
}

я пытаюсь сделать массовое обновление данных, как показано ниже

db.rates.update(
  { "_id" : 1234 },
  { $set: { "rates.$[item].rate": 200  } },
  { multi: true, 
   arrayFilters: [ { "item.rateCardId": {$in: [ 1, 2]} } ]
  }
)

Сейчас и пытаюсь конвертировать этот код в Java. Ниже приведен код, который мне удалось получить для случая массового обновления. Как и ожидалось, приведенный ниже запрос обновляет весь документ из-за использования $ []. Я пытаюсь выяснить, как применять фильтры массива здесь, используя операторы позиционного обновления массива (например, $ [one]).

WriteResult wr = getMongoTemplate().updateMulti(
            new Query(where("rates.rateCardId").is(1234)),
            new Update().set("rates.$[].rate", 200),
            ProductRates.class);

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

Ответы на вопрос(1)

Ваш ответ на вопрос