我有一个集合,它有一个名为"数据";可以具有任何字段,并且我必须获得"中所有集合中的所有现有字段;数据";字段或获取在该"字段"中具有不同字段的文档;数据";领域
例如,如果我有:
[
{
_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,然后使用类似于循环的FOR(对于资源(
无论你如何执行(在内存或数据库中(,这都是一个非常昂贵的查询,也就是说,我同意在内存中执行这是错误的方法。
以下是如何使用聚合管道和一些标准运算符(如$map
和$objectToArray
:(来实现这一点
db.collection.aggregate([
{
$project: {
keys: {
$map: {
input: {
"$objectToArray": "$data"
},
in: "$$this.k"
}
}
}
},
{
"$unwind": "$keys"
},
{
$group: {
_id: "$keys"
}
}
])
Mongo游乐场
一旦集合中有了所有文档的数组,就可以使用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"
]