我有一個集合,其中包含一個名為“data”的欄位,該欄位可以包含任何欄位,并且我必須在該“資料”欄位中獲取所有集合中的所有現有欄位,或者獲取在該“資料”欄位中具有不同欄位的檔案。
例如,如果我有:
[
{
_id: "45454",
name: "fulano",
city: "cali",
data: {
age: 12,
lastName: "panguano",
cars: 0
}
},
{
_id: "67899",
name: "juanito",
city: "cali",
data: {
age: 23,
lastName: "merlano",
cars: 2
}
},
{
_id: "67899",
name: "olito",
city: "nw",
data: {
lastName: "betito",
cars: 2
}
},
{
_id: "11223",
name: "cabrito",
city: "trujillo",
data: {
age: 28,
cars: 1,
moto: 3
}
},
]
我想得到什么:
["age", "lastName", "cars", "moto"]
或:
“資料”欄位變化的檔案,無論它們的值如何。
[
{
_id: "45454",
name: "fulano",
city: "cali",
data: {
age: 12,
lastName: "panguano",
cars: 0
}
},
{
_id: "67899",
name: "olito",
city: "nw",
data: {
lastName: "betito",
cars: 2
}
},
{
_id: "11223",
name: "cabrito",
city: "trujillo",
data: {
age: 28,
cars: 1,
moto: 3
}
}
]
如果我使用 FINDALL,然后使用類似的回圈(對于資源),集合有這么多檔案可能會成為問題
uj5u.com熱心網友回復:
無論您如何執行此操作(在記憶體中或在資料庫中),這都是一個非常昂貴的查詢,也就是說我同意在記憶體中執行此操作是錯誤的方法。
以下是使用聚合管道和一些標準運算子(如$map
and )的方法$objectToArray
:
db.collection.aggregate([
{
$project: {
keys: {
$map: {
input: {
"$objectToArray": "$data"
},
in: "$$this.k"
}
}
}
},
{
"$unwind": "$keys"
},
{
$group: {
_id: "$keys"
}
}
])
蒙戈游樂場
uj5u.com熱心網友回復:
一旦您擁有集合中所有檔案的陣列,這是一種使用 javascript 的方法:
let arr = [
{
_id: "45454",
name: "fulano",
city: "cali",
data: {
age: 12,
lastName: "panguano",
cars: 0
}
},
{
_id: "67899",
name: "juanito",
city: "cali",
data: {
age: 23,
lastName: "merlano",
cars: 2
}
},
{
_id: "67899",
name: "olito",
city: "nw",
data: {
lastName: "betito",
cars: 2
}
},
{
_id: "11223",
name: "cabrito",
city: "trujillo",
data: {
age: 28,
cars: 1,
moto: 3
}
},
]
您可以使用 .map 方法來獲取資料物件的陣列,如下所示:
arr = arr.map(obj => obj.data)
這將回傳
[
{
"age": 12,
"lastName": "panguano",
"cars": 0
},
{
"age": 23,
"lastName": "merlano",
"cars": 2
},
{
"lastName": "betito",
"cars": 2
},
{
"age": 28,
"cars": 1,
"moto": 3
}
]
然后,您可以通過回圈遍歷資料物件陣列來獲取資料物件鍵陣列,如下所示:
let dataKeys = [];
arr.forEach(obj => {
dataKeys = [...dataKeys, ...Object.keys(obj)]
})
這將回傳一個非唯一鍵陣列:
dataKeys = [
"age",
"lastName",
"cars",
"age",
"lastName",
"cars",
"lastName",
"cars",
"age",
"cars",
"moto"
]
然后使用 .filter 和 .findIndex 方法過濾掉唯一鍵:
let uniqueKeys = dataKeys.filter((elem, index) => dataKeys.findIndex(obj => obj === elem) === index)
這會給你
[
"age",
"lastName",
"cars",
"moto"
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/506434.html