java - 删除 map 的所有键都包含在mongodb列表中的位置

标签 java spring mongodb spring-boot spring-data-mongodb

我有这个:

  • 一个字段,它是一个映射,其中键是 UUID,值是另一个不相关的对象。
  • 应作为参数传递的 UUID 列表。

我想:

从集合中删除所有映射的所有键都包含在 UUID 列表中的文档

对象:

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

对于派生查询,我无法访问 UUID,因为没有名称 -> deleteByMyMap...

通过查询,我知道有一种方法可以将 map 转换为数组($expr 和 $objectToArray),但我不知道它是否有意义。

  • 有什么办法吗?
  • 如何才能只访问 map 的键?

最佳答案

这是一种方法,使用聚合管道获取所有符合条件的文档的 _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. 然后计算键数组和 id 列表之间的差异。
  3. 然后所有具有空差异的文档都被拾取并投影它们的 _id。

使用这些 ID,您可以简单地执行以下操作:

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

Playground for the aggregation.

关于java - 删除 map 的所有键都包含在mongodb列表中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74065548/

相关文章:

spring - 使用 Spring Servet 为 REST API 处理创建异步线程

java - Spring beans 认识

java - ClassPathXmlApplicationContext 出现 NoClassDefFoundError?

node.js - NodeJS 加密 : re-use cipher object to improve performance

javascript - 如何在 angular.js 中处理多个异步任务?

java - 过滤时 lambda 表达式中的空值在 Java 中出现异常

java - Java EE 7 属性文件配置的最佳实践建议是什么?

java - 校验和计算 - 最低有效字节的二进制补码

javascript - Nodejs : Can not read property of null

java - 使用Gradle Java将src/test/resources用作目录