我有这个:
- 一个字段,它是一个映射,其中键是 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
}
}
])
工作原理:
- 首先,将映射转换为数组,然后将该数组映射到键。
- 然后计算键数组和 id 列表之间的差异。
- 然后所有具有空差异的文档都被拾取并投影它们的 _id。
使用这些 ID,您可以简单地执行以下操作:
db.collection.remove({_id: {$in: [// the list here]}});
关于java - 删除 map 的所有键都包含在mongodb列表中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74065548/