我有這個:
- 一個欄位,它是一個映射,其中鍵是 UUID,值是另一個不相關的物件。
- 應作為引數傳遞的 UUID 串列。
我想:
從集合中洗掉所有映射的所有鍵都包含在 UUID 串列中的檔案
物件:
@Document
public class MyClass
{
private Map<UUID, anotherObject> myMap;
}
使用派生查詢,我無法訪問 UUID,因為沒有名稱-> deleteByMyMap ...
通過查詢,我知道有一種方法可以將地圖轉換為陣列($expr 和 $objectToArray),但我不知道它是否有意義。
- 有沒有辦法做到這一點?
- 如何僅訪問地圖的鍵?
uj5u.com熱心網友回復:
這是一種方法,使用聚合管道獲取_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]}});
聚合的游樂場。
uj5u.com熱心網友回復:
試試這個可能會有所幫助:獲取單個檔案中的鍵您還可以使用聚合來獲取單個檔案中的鍵:
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" } )]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/514387.html
