MongoDB Java Драйвер: как использовать оператор $ cond? - PullRequest
1 голос
/ 07 августа 2020

Я написал следующий запрос на обновление MongoDB:

db.getCollection("product").update(
  {},
  [
    {
      $set: {
        availability: {
          $cond: [
            {
              $eq: ["$availability", true],
            },
            "Yes",
            "No",
          ],
        },
      },
    }
  ]
);

, который обновляет все документы в коллекции product: установите новое значение для свойства availability на основе его текущего значения.

И я пытаюсь переписать запрос выше для MongoDB Java driver:

db.getCollection("product")
     .updateMany(new BsonDocument(), Updates.set("available", "YES"));

, но я застрял с оператором $cond, я не знаю, как перевести оператор $cond из запроса MongoDB в Java драйвер.

Не могли бы вы предложить возможные варианты?

1 Ответ

1 голос
/ 07 августа 2020

Вам необходимо использовать другой вариант, для которого требуется ClientSession, а не MongoClient

UpdateResult updateResult = this.mongoColWrite.
                 updateMany(this.clientSession, new Document(), setUpdateList);

empty doc - это условие. Вы можете добавить туда любое условие.

Вы должны предоставить список для обновления.

[
    {
      $set: {
        availability: {
          $cond: [
            {
              $eq: ["$availability", true],
            },
            "Yes",
            "No",
          ],
        },
      },
    }
  ]

LinkedList<Object> condList = new LinkedList<Object>();
LinkedList<Object> eqArray = new LinkedList<Object>();
eqArray.add("$availability");
eqArray.add(true); 
condList.add(new Document("$eq"), eqArray);
condList.add("Yes");
condList.add("No");

Document availDoc = new Document("$cond", condList)
Document setDoc = new Document("$set", availDoc);

LinkedList<Document> setUpdateList = new LinkedList<Document>();
setUpdateList.add(setDoc);

Я обычно так и поступаю. Каждый массив - это list. Каждый объект - это Document.

Пример со старой версией

...