Удалить, где все ключи карты содержатся в списке в mongodb

У меня есть это:

  • Поле, представляющее собой карту, где ключами являются UUID, а значением является другой объект, который не имеет отношения к делу.
  • Список UUID, которые следует передавать в качестве параметра.

Я хочу:

удалить из коллекции все документы, где все ключи карты включены в список UUID

Предмет:

@Document
public class MyClass
{
  private Map<UUID, anotherObject> myMap;
}

С производными запросами я не могу получить UUID, потому что у него нет имени -> deleteByMyMap...

И с запросом я знаю, что есть способ преобразовать карту в массив ($expr и $objectToArray), но я не знаю, имеет ли это смысл.

  • Есть какой-либо способ сделать это?
  • Как я могу получить доступ только к ключу карты?
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

попробуй это может поможет: Получите ключи в одном документе Вы также можете использовать агрегацию для получения ключей в одном документе:

db.activities.aggregate([ {"$project":{"arrayofkeyvalue":{"$objectToArray":"$$ROOT"}}}, {"$project":{"keys":"$arrayofkeyvalue.k"}} ])

удалить:

db['name1.name2.name3.Properties'].remove([ { "key" : "name_key1" }, { "key" : "name_key2" }, { "key" : "name_key3" } )]

Это один из способов сделать это: используйте конвейер агрегации, чтобы получить _id всех документов, соответствующих вашим критериям:

db.collection.aggregate([
  {
    "$addFields": {
      keysOfMap: {
        "$map": {
          "input": {
            "$objectToArray": "$myMap"
          },
          "as": "item",
          "in": "$$item.k"
        }
      },
      
    }
  },
  {
    "$addFields": {
      "difference": {
        "$setDifference": [
          "$keysOfMap",
          [
            "63f62530-89b1-439e-bcb3-2c7ab614ecda",
            "dcbb1469-3ca0-4547-b7d1-296ba2f0a01d"
          ]
        ]
      }
    }
  },
  {
    "$match": {
      difference: []
    }
  },
  {
    "$project": {
      _id: 1
    }
  }
])

Как это работает:

  1. Сначала карта преобразуется в массив, а затем этот массив сопоставляется с ключами.
  2. Затем вычисляется разница между массивом ключей и списком идентификаторов.
  3. Затем подбираются все документы, имеющие пустые различия, и проецируется их _id.

Используя эти идентификаторы, вы можете просто сделать:

db.collection.remove({_id: {$in: [// the list here]}});

Площадка для агрегации.

Ответ принят как подходящий

Это также может быть ответом:

db.collection.aggregate([
  {
    "$project": {
      "mapAsArray": {
        "$objectToArray": "$map"
      }
    }
  },
  {
    "$match": {
      "mapAsArray": {
        "$not": {
          "$elemMatch": {
            "k": {
              $nin: [
                "3478956c-3a01-404f-84e7-2a076e165215",
                "1e1d1efb-5bf9-48ac-93ca-4a2df5a9f7eb"
              ]
            }
          }
        }
      }
    }
  }
])

Здесь mongoplayground

Карта для spring-data-mongodb:

ProjectionOperation projectionOperation = project()
            .and(ObjectOperators.valueOf(myMap).toArray()).as(myMapToArray);

MatchOperation matchOperation = match(where(myMapToArray)
            .not()
            .elemMatch(where("k").nin(myList)));

AggregationResults<myObject> aggregate = mongoTemplate.aggregate(newAggregation(projectionOperation, matchOperation),
            myObject.class, myObject.class);

Другие вопросы по теме

Конкретная продолжительность блока ограничителя скорости Java Spring при достижении соотношения
Как пользовательское сообщение об обработке исключений может быть сокращено до более короткого для проекта Spring Boot?
Spring webflux — как вернуть DTO в моно, просматривая два одновременных вызова, которые возвращают Mono и Flux?
Вызов метода @Transactional из исходного метода @Transactional вызывает проблему отката в том же классе
Почему браузеры не позволяют [::1]:8080 устанавливать cookie с доменом = 127.0.0.1?
Как создать собственный @ConditionalOnProperty для более простого использования?
Как опубликовать сообщение в теме Kafka, используя поток весеннего облака реактивным способом [используя webflux]?
Дочерний объект карты Java Json как идентификатор
Почему у меня «Сбой создателя жизненного цикла Builder» с кодом состояния 51, когда я запускаю «mvn spring-boot: build-image»
SPRING BOOT — @OneToMany и мой набор<> пуст