我的收藏中有以下資料:
[
{
_id: "2313123123",
metadata: {
path: "...",
value: "...",
name: "..."
}
},
{
_id: "2313123123",
metadata: {
path: "...",
name: "...",
origin: "...",
}
},
{
_id: "2313123123",
metadata: {
path: "...",
source: "..."
}
},
]
我想metadata從我的檔案中檢索該欄位的所有不同鍵名。我想找回["path", "value", "name", "origin", "source"]。
我該如何查詢這個?這可以通過該distinct方法實作還是我需要使用aggregate?
uj5u.com熱心網友回復:
您必須為此使用聚合,遺憾的是,由于您的需求性質,這將是一個非常“昂貴”的執行管道。無法避免遍歷整個集合并將唯一鍵添加到陣列中。
我們將使用$objectToArray變成metadata一個陣列,然后$unwind使用它,最后使用$group我們可以保存所有唯一值。
db.collection.aggregate([
{
$project: {
keys: {
$map: {
input: {
"$objectToArray": "$metadata"
},
in: "$$this.k"
}
}
}
},
{
$unwind: "$keys"
},
{
$group: {
_id: null,
keys: {
"$addToSet": "$keys"
}
}
}
])
蒙戈游樂場
uj5u.com熱心網友回復:
db.collection.aggregate([
{
$addFields: {
metadata: {
$objectToArray: "$metadata"
}
}
},
{
$unwind: "$metadata"
},
{
$group: {
_id: "distinct",
dist: {
$addToSet: "$metadata.k"
}
}
}
])
解釋:
- 將元資料物件轉換為元資料陣列,其中鍵作為 k 鍵中的值。
- 展開 k 鍵和 v 值的元資料陣列
- 使用 addToSet 分組以僅提取最終結果中不同的 k 值。
操場
來自 mongo shell 選項的有用的 javascript onliner:
db.collection.find({},{metadata:1,_id:0}).forEach( function(doc) { for (key in doc.metadata) s.push(key); } );uni = Array.from(new Set(s));printjson(uni);
["path","name","origin","source","value"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/419913.html
標籤:
上一篇:SQL排序和排序表
